我有一个对象,让我们说它叫做“事件”。活动有几个选项。
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,如果不可用则返回。
谢谢!
答案 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,则返回可选字符串,否则无。)