一个更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
nil-coalescing 运算符(as 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 运算符) - 因此使用 nil-coalescing 解决方案nilIfEmpty
更可取。
此外,您可以使用后者来防止someOptionalString?.isEmpty ?? true
if 语句和三元运算中的常见(和混乱)舞蹈,如:
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...
}