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

У меня есть объект, допустим, он называется «Событие». Событие имеет несколько опций.

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)."
  }
}

Когда я вызываю описание, оно возвращает строку, и в зависимости от того, существуют они или нет, необязательные значения возвращают nil или «Необязательно (имя события)». Я хочу, чтобы некоторые свойства были нулевыми и возвращали развернутое значение, если они существуют.

Я рассматривал этот вариант:

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."
}

Это работает, но для меня, чтобы охватить все случаи, это займет вечность. Он может содержать сотни дел.

Итак, мой вопрос: есть ли более простой способ сделать это? Вернуть nil, если он недоступен, и развернуть, если он есть.

Благодарю вас!


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)."
}

Следует отметить две вещи: вы не можете помещать кавычки в строки, поэтому вам нужно создать переменную notSet (конечно, вы можете использовать несколько разных значений по умолчанию в зависимости от ваших потребностей). И вы также не можете использовать в них массивы, поэтому вам нужно преобразовать массив в строку (в этом случае, объединив записи запятой — эта другая карта является необязательной картой — если массив не равен нулю, верните необязательную строку, иначе ноль).

person Airspeed Velocity    schedule 29.01.2015