Swift字符串插值显示可选?

Swift字符串插值显示可选?,swift,interpolation,Swift,Interpolation,当我使用以下代码并将nameTextField设置为“Jeffrey”(或任何其他名称)时 名称标签显示。。。你好,可选(“杰弗里”) 但是,当我将前面的代码更改为包含一个“!”时,如下所示: @IBAction func helloWorldAction(nameTextField: UITextField) { nameLabel.text = "Hello, \(nameTextField.text!)" } 代码按预期工作,名称标签显示。。。。你好,杰弗里 为什么需要“!”

当我使用以下代码并将nameTextField设置为“Jeffrey”(或任何其他名称)时

名称标签显示。。。你好,可选(“杰弗里”)

但是,当我将前面的代码更改为包含一个“!”时,如下所示:

@IBAction func helloWorldAction(nameTextField: UITextField) {

    nameLabel.text = "Hello, \(nameTextField.text!)"

}
代码按预期工作,名称标签显示。。。。你好,杰弗里


为什么需要“!”,在我用来创建这个简单程序的视频教程中,他没有使用“!”并且程序按预期工作

选项必须展开。您必须检查它或强制展开。将可选项想象为一个框,在其中输入一个值。在你可以访问它之前,你需要把它放出去

if let name = nameTextField.text {
    nameLabel.text = "Hello, \(name)"
}

另一种选择是在插值字符串中使用null合并运算符,以获得更漂亮的文本,而不需要
if let

nameLabel.text = "Hello, \(nameTextField.text ?? "")"

在这种情况下,它的可读性较差,但如果有很多字符串,则可能更可取。

这里有一个方便的扩展,可以将
任意?
展开到
字符串

nil
值设置默认值

extension String {
    init(_ any: Any?) {
        self = any == nil ? "My Default Value" : "\(any!)"
    }
}
//范例

let count: Int? = 3
let index: Int? = nil
String(count)
String(index)

// Output
// 3
// My Default Value

您也可以使用可选地图。
是我学会如何使用它的地方

基本上,map将接受一个可选值,如果有值则返回一个值,如果没有值则返回nil。 它认为这在代码中更有意义,因此我发现以下代码很有用:

func getUserAge() -> Int? {  
    return 38  
}

let age = getUserAge()

let ageString = age.map { "Your age is \($0)" }
print(ageString ?? "We don't know your age.")
我想这在传入可选字符串的情况下可能没有太大帮助(在这种情况下,nil coalescing可以很好地工作),但在需要使用非字符串的值时,这非常有帮助。

当您想在给定值上运行逻辑时,它更有用,因为map是一个闭包,您可以多次使用$0。

这似乎是Swif的创建者为字符串插值所做的糟糕设计选择。我不知道还有哪种语言能做到这一点。打印未包装的值(如果存在)更有意义,否则打印为空或为零。或者不允许在字符串内插入选项。这给我们带来了大量的错误。每当我使用它时,它会使我的构建时间增加四倍。不幸的是,在我的例子中,我尝试插入可选的Int值——不能与空字符串合并。@RonLugge不,但可以使用零:-)@CraigMcMahon,如果您正在构建一个可能(或可能不)的路径,那么零将是错误的在末尾有一个对象ID。例如。
func getUserAge() -> Int? {  
    return 38  
}

let age = getUserAge()

let ageString = age.map { "Your age is \($0)" }
print(ageString ?? "We don't know your age.")