当我使用以下代码并且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
为什么是“!”需要,在我用来创建这个简单程序的视频教程中,他没有使用“!”该计划按预期工作。
答案 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。