您可以将nil coalescing operator 用于可选的middleName 属性。如果值为nil,则将打印默认的"",而如果该值包含非零字符串,则将其解包。
return ("\(name.firstName) \(name.middleName ?? "") \(name.lastName)")
但是请注意,您不必让 returnFullName(..) 函数的返回类型是可选的,因为该值永远不会为零。
func returnFullName (name: (firstName: String, middleName: String?,
lastName: String)) -> String {
return ("\(name.firstName) \(name.middleName ?? "") \(name.lastName)")
}
print(returnFullName(("Matthew", middleName: "Matt", lastName: "Stevenson")))
// Matthew Matt Stevenson
print(returnFullName(("Matthew", middleName: nil, lastName: "Stevenson")))
// Matthew Stevenson <-- extra unwanted space
另外,我没有看到任何明显的理由在函数签名中使用元组,而不是为不同的名称组件单独参数。因此,一个替代方案如下:
func returnFullName (firstName: String, middleName: String?,
lastName: String) -> String {
return "\(firstName) \(middleName ?? "") \(lastName)"
}
print(returnFullName("Matthew", middleName: "Matt", lastName: "Stevenson"))
// Matthew Matt Stevenson
print(returnFullName("Matthew", middleName: nil, lastName: "Stevenson"))
// Matthew Stevenson <-- extra unwanted space
最后,为了避免nil-valued middleName 的额外空间,我建议保留单行返回,而是使用带有if let - else 子句的可选绑定:
func returnFullName(firstName: String, middleName: String?, lastName: String) -> String {
if let middleName = middleName {
return ("\(firstName) \(middleName) \(lastName)")
}
else {
return ("\(firstName) \(lastName)")
}
}
print(returnFullName("Matthew", middleName: "Matt", lastName: "Stevenson"))
// Matthew Matt Stevenson
print(returnFullName("Matthew", middleName: nil, lastName: "Stevenson"))
// Matthew Stevenson
现在,问题涉及解开给定示例的可选变量,上面已经很好地介绍了这一点。不过,我想我会提到,您可以使用闭包和 Swifts 内置函数方法来压缩您的解决方案,如下所示:
// instead of a function: make use of a closure
let returnFullName : (String, String?, String) -> String = {
[$0, $1, $2].flatMap{ $0 }.joinWithSeparator(" ") }
print(returnFullName("Matthew", "Matt", "Stevenson"))
// Matthew Matt Stevenson
print(returnFullName("Matthew", nil, "Stevenson"))
// Matthew Stevenson