多次打开选项

时间:2015-01-29 10:04:45

标签: swift optional unwrap

我有一个对象,让我们说它叫做“事件”。活动有几个选项。

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或“Optional(Event name)”。我希望某些属性的选项为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,如果不可用则返回。

谢谢!

1 个答案:

答案 0 :(得分:3)

您需要使用nil-coalescing运算符??

// 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变量(当然,您可以根据需要使用多个不同的默认值)。并且您不能在其中使用数组,因此需要将数组转换为字符串(在这种情况下,通过使用逗号连接条目 - 其他映射是可选映射 - 如果数组是非nil,则返回可选字符串,否则无。)