一个更 Swift-y 的解决方案,用于检查“x 是空还是空?”是使用扩展名:
extension Optional where Wrapped == String {
var nilIfEmpty: String? {
guard let strongSelf = self else {
return nil
}
return strongSelf.isEmpty ? nil : strongSelf
}
var isEmptyOrNil: Bool {
guard let strongSelf = self else {
return true
}
return strongSelf.isEmpty
}
}
let newText2 = inputField.text ?? defaultText 失败的原因是因为默认情况下inputField.text = "" 不属于 nil-coalescing 运算符的nil 情况(如Optional("") != nil)。
您可以使用这些Optional<String> 扩展来替换:
let newText = inputField.text!.isEmpty ? defaultText : inputField.text!
let newText2 = inputField.text ?? defaultText
与
let newText = inputField.text.isEmptyOrNil ? defaultText : inputField.text!
let newText2 = inputField.text.nilIfEmpty ?? defaultText
两者都可以正常工作。虽然我建议安全地展开 inputField.text 而不是使用 ! 运算符(尽管这在技术上是安全的,但我尽量避免使用 bang 运算符) - 因此使用 nilIfEmpty 的 nil-coalescing 解决方案更可取。
此外,您可以使用后者来防止在 if 语句和三元运算中出现常见(和混乱)someOptionalString?.isEmpty ?? true 舞蹈,如:
if someOptionalString.isEmptyOrNil {
// Do something when a string is empty or nil...
}
比
干净得多
if someOptionalString?.isEmpty ?? true {
// Do something when a string is empty or nil...
}