可选的多重解包

Multiple unwrap of optionals

我有一个对象,假设它叫 "Event"。事件有几个选项。

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

当我调用描述时,它将 return 一个字符串,并且根据它们是否存在,可选值将 return nil 或 "Optional(Event name)"。我希望某些属性的选项为 nil,return 如果它们存在,则为未包装的值。

我看过这个选项:

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

这行得通,但对我来说,要涵盖所有情况,这将需要很长时间。它可能包含数百个案例。

所以我的问题是:有没有更简单的方法来做到这一点? Return 如果不可用则为 nil,如果可用则展开。

谢谢!

您需要零合并运算符,??:

// 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([=11=]) }

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

有两点需要注意——您不能在字符串插入中使用引号,因此您必须创建一个 notSet 变量(当然,您可以根据需要使用多个不同的默认值)。而且你也不能在其中使用数组,所以需要将数组转换为字符串(在这种情况下,通过用逗号连接条目——另一个映射是可选映射——如果数组是非零的,return一个可选的字符串,否则为零)。