可选的多重解包
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一个可选的字符串,否则为零)。
我有一个对象,假设它叫 "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一个可选的字符串,否则为零)。