Swift String Interpolation显示可选的?

时间:2015-07-14 21:37:57

标签: swift interpolation

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

@IBAction func helloWorldAction(nameTextField: UITextField) {

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

}

nameLabel显示... Hello,Optional(“Jeffrey”)

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

@IBAction func helloWorldAction(nameTextField: UITextField) {

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

}

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

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

4 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:12)

必须打开选项。您必须检查它或强行打开包装。想象一下,将可选项作为一个放置值的框。在你可以访问它之前,你需要把它拿出来。

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

答案 2 :(得分:0)

这是将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

答案 3 :(得分:0)

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

基本上,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.")

我猜想这在您传递可选字符串的情况下可能无济于事(在这种情况下,零合并可以很好地工作),但是当您需要使用一些非必需的值时,这很有用不是字符串。
当您想在给定值上运行逻辑时,此功能尤其有用,因为map是一个闭包,并且可以多次使用$ 0。