Swift 字符串插值显示可选?

Swift String Interpolation displaying optional?

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

@IBAction func helloWorldAction(nameTextField: UITextField) {

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

}

nameLabel 显示...您好,可选("Jeffrey")

但是,当我更改之前的代码以包含一个“!”时像这样:

@IBAction func helloWorldAction(nameTextField: UITextField) {

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

}

代码按预期工作,nameLabel 显示....你好,Jeffrey

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

Optionals 必须展开。您必须检查它或像您一样强制解包。把可选的想象成一个盒子,你可以在里面放一个值。需要先放出来才能访问

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

另一种方法是在插入的字符串中使用空合并运算符以获得更漂亮的文本,而无需 if let.

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

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

这是一个方便的扩展程序,可以将 Any? 解包为 String

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

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

基本上,map 将采用可选值,如果有值则 return 一个值,如果没有值则 return nil。 它认为这在代码中更有意义,所以这是我发现有用的代码:

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

let age = getUserAge()

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

我想这在您传递可选字符串的情况下可能不是特别有用(在这种情况下 nil 合并工作得很好),但是当您需要使用一些值时这非常有用那不是字符串。
当您想对给定值进行 运行 逻辑时,它会更有用,因为 map 是一个闭包,您可以多次使用 $0。