在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 次 |
| 最近记录: |