Swift 光学元件的多重展开

Swift 光学元件的多重展开,swift,optional,unwrap,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). A

我有一个对象,比方说它叫“事件”。事件有几个选项

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,如果存在,则返回unwrapped值

我已经研究过这个选项:

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;如果可用,则返回unwrap


谢谢大家!

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

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

需要注意的两件事-不能在字符串interp中加引号,因此必须创建
notSet
变量(当然,可以根据需要使用多个不同的默认值)。您也不能在数组中使用数组,因此需要将数组转换为字符串(在本例中,通过用逗号连接条目-其他映射为可选映射-如果数组为非nil,则返回可选字符串,否则为nil)。

您需要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($0) }

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

需要注意的两件事-不能在字符串interp中加引号,因此必须创建
notSet
变量(当然,可以根据需要使用多个不同的默认值)。您也不能在数组中使用数组,因此需要将数组转换为字符串(在本例中,通过用逗号连接条目-其他映射为可选映射-如果数组为非nil,则返回可选字符串,否则为nil)。

您需要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($0) }

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

需要注意的两件事-不能在字符串interp中加引号,因此必须创建
notSet
变量(当然,可以根据需要使用多个不同的默认值)。您也不能在数组中使用数组,因此需要将数组转换为字符串(在本例中,通过用逗号连接条目-其他映射为可选映射-如果数组为非nil,则返回可选字符串,否则为nil)。

您需要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($0) }

    return "Name: \(name ?? notSet). Location: \(location ?? notSet). Attendees: \(attendeesString ?? notSet). Dresscode: \(dresscode ?? notSet). Start date: \(startDate ?? notSet). End date: \(endDate ?? notSet)."
}
需要注意的两件事-不能在字符串interp中加引号,因此必须创建
notSet
变量(当然,可以根据需要使用多个不同的默认值)。您也不能在数组中使用数组,因此需要将数组转换为字符串(在本例中,通过使用逗号连接条目-其他映射为可选映射-如果数组为非nil,则返回可选字符串,否则为nil)