2

应该这样做

var inputField =  UITextField()
let defaultText = "PLACEHOLDER"
let newText = inputField.text!.isEmpty ? defaultText : inputField.text!
let newText2 = inputField.text ?? defaultText

newText工作,并输出PLACEHOLDER.

newText只显示""在 Swift 的预览栏中

为什么?如何使它正确?

4

3 回答 3

1
import UIKit

var inputField =  UITextField()
inputField.text?.isEmpty // true !!!
// by deafault it is empty, so i set it
inputField.text = "default text"

let defaultText = "PLACEHOLDER"
let newText = inputField.text?.isEmpty == true ? defaultText : inputField.text!
let newText2 = inputField.text ?? defaultText

print(newText)  // default text
print(newText2) // default text

在您的代码片段中 newText2 是空字符串,因为 inputField.text 不是 nil

如何做到这一点的安全方法(inputField.text 可以是 nil、空或一些文本)

import UIKit

var inputField =  UITextField()
let defaultText = "PLACEHOLDER"
if let txt = inputField.text {
    inputField.text = txt.isEmpty ? defaultText : txt
}

let newText = inputField.text ?? defaultText

print(inputField.text, newText) // Optional("PLACEHOLDER") PLACEHOLDER

结果,如果 inputField.text 为空或 nil,则将其设置为某个默认值,否则不会更改文本

于 2016-03-06T20:33:08.563 回答
1

""和之间有很大区别nil。您的text属性是的,但它不是 nil。(它实际上等于 string ""。)因此,您的检查.isEmpty工作有效,但您尝试 nil 合并却没有。另一方面,这将起作用:

let text: String? = nil
let newText2 = text ?? defaultText

所以你对 nil 合并的理解很好;您对空文本字段返回的假设nil不是:它实际上返回一个空但存在的字符串。

于 2016-03-06T20:21:33.773 回答
0

一个更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 = ""默认情况下,它不属于nilnil-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 ?? trueif 语句和三元运算中的常见(和混乱)舞蹈,如:

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...
}
于 2019-08-08T10:54:54.817 回答