Swift语言中属性中的感叹号是什么?

Art*_*mov 44 swift

在Swift中声明属性有三种方法:

var optStr: String?
var normStr: String = "normStr"
var exactStr: String!
Run Code Online (Sandbox Code Playgroud)

第一个是具有optional类型的属性,在我们的例子中可以包含nil或String的类型.第二个是始终包含String 的属性.它应该在init或声明中初始化.

但第三种方式呢?

var exactStr: String!
Run Code Online (Sandbox Code Playgroud)

我在操场上做了一些实验,事实证明,需要一个功能,type?可以采取两种type,type?type!变量作为参数:

var optStr: String?
var normStr: String
var forcedStr: String!

func printStr(str: String?) {
    println("str: \(str)")
}

printStr(optStr) //prints: "str: nil"
//printStr(normStr) //doesn't compile as not initialized
printStr(forcedStr) //prints: "str: nil"

optStr = "optStr"; normStr = "normStr"; forcedStr = "forcedStr"

printStr(optStr) //prints "str: optStr"
printStr(normStr) //prints "str: normStr"
printStr(forcedStr) //prints "str: forcedStr"
Run Code Online (Sandbox Code Playgroud)

那么为什么以及何时应该使用type!

更新:这与Swift语言中感叹号的含义不重复.我不是要求解开一个变量:我问的是declaring一个带有感叹号的属性(Type!).

BJ *_*mer 67

它是"隐式解包的可选字符串"类型的变量.从本质上讲,每次访问都implicitStr被视为写入implicitStr!(因此展开值).

当然,如果值为零,则会导致崩溃.您仍然可以测试隐式可选通道if implicitStr != nil,或者在可选链接中使用它var foo = implicitStr?.uppercaseString.所以你仍然可以像普通的可选项一样安全地使用它; 它只是偏向于价值不是零的情况.

隐式解包的选项在初始化时可能不存在的情况下非常有用,但是提前设置并且不太可能再次变为零.(例如,您在-awakeFromNib中设置的变量可能合理地是一个隐式解包的可选项.)

此外,由于Objective-C方法可以返回nil和object类型,因此它们的返回值不能被建模为非可选的.但是,为了避免在处理Cocoa API时需要自由使用强制解包,Cocoa API的参数和返回类型通常表示为隐式解包的选项.


归档时间:

查看次数:

17030 次

最近记录:

8 年,11 月 前