Множество разопаковане на опции

Имам обект, да кажем, че се нарича „Събитие“. Събитието има няколко опции.

struct Event {
var name: String!
var location: String?
var attendees: [String]?
var dresscode: String?
var startDate: NSDate!
var endDate: NSDate?

var description: String {
    return "Name: \(name). Location: \(location). Attendees: \(attendees). Dresscode: \(dresscode). Start date: \(startDate). End date: \(endDate)."
  }
}

Когато извикам описанието, то ще върне низ и в зависимост от това дали съществуват или не незадължителните стойности ще върнат нула или „По избор (име на събитие)“. Искам опцията за някои от свойствата да е нула и да връща разопакованата стойност, ако съществува.

Гледах този вариант:

var description: String {

    switch (location, attendees, dresscode, endDate) {
        //All available
    case let (.Some(location), .Some(attendees), .Some(dresscode), .Some(endDate)):
        return "Name: \(name). Location: \(location). Attendees: \(attendees). Dresscode: \(dresscode). Start date: \(startDate). End date: \(endDate)."
    case let (.None, .Some(attendees), .Some(dresscode), .Some(endDate)):
        return "Name: \(name). Location: Not Set. Attendees: \(attendees). Dresscode: \(dresscode). Start date: \(startDate). End date: \(endDate)."
    default: return "Something."
}

Това работи, но за мен ще отнеме цяла вечност, за да покрия всички случаи. Може да съдържа стотици случаи.

Така че въпросът ми е: Има ли по-лесен начин да направите това? Връща нула, ако не е налично, и разгръща, ако е.

Благодаря ти!


person fisher    schedule 29.01.2015    source източник


Отговори (1)


Нуждаете се от оператора за нулево обединяване, ??:

// s will be Not Set if name == nil, 
// unwrapped value of s otherwise
let s = name ?? "Not set" 

След това можете да използвате това вътре в интерполацията на низ:

var description: String {
    let notSet = "Not set"
    let attendeesString = attendees.map { ",".join($0) }

    return "Name: \(name ?? notSet). Location: \(location ?? notSet). Attendees: \(attendeesString ?? notSet). Dresscode: \(dresscode ?? notSet). Start date: \(startDate ?? notSet). End date: \(endDate ?? notSet)."
}

Две неща, които трябва да се отбележат - не можете да поставите кавички в string interps, така че трябва да създадете променлива notSet (разбира се, можете да използвате множество различни стойности по подразбиране в зависимост от вашите нужди). Освен това не можете да използвате масиви в тях, така че трябва да преобразувате масива в низ (в този случай чрез свързване на записи със запетая – тази друга карта е опционална карта – ако масивът е различен от нула, върнете незадължителен низ, иначе нула).

person Airspeed Velocity    schedule 29.01.2015