1

我是 swift 的新手。当我声明一个变量时,或者当我获得一个实例的属性时,我发现“!” 和 ”?” 无处不在。在Objective-C中做这样的事情很容易,你甚至可以不知道“id”类型的类的类型。为什么我们需要!?

我想知道设计!和的原因?,而不是如何使用它们。拥有可选类型有什么好处?

4

2 回答 2

3

好...

? (Optional)表示您的变量可能包含 nil 值,同时! (unwrapper)表示您的变量在运行时使用(试图从中获取值)时必须具有内存(或值)。

主要区别在于,当可选项为 nil 时,可选项链接会优雅地失败,而当可选项为 nil 时,强制解包会触发运行时错误。

为了反映可以对 nil 值调用可选链接这一事实,可选链接调用的结果始终是可选值,即使您正在查询的属性、方法或下标返回非可选值也是如此。您可以使用此可选返回值来检查可选链接调用是否成功(返回的可选包含一个值),或者由于链中的 nil 值而没有成功(返回的可选值为 nil)。

具体来说,可选链接调用的结果与预期返回值的类型相同,但包装在可选中。通常返回 Int 的属性将返回Int? 通过可选链接访问时。

var defaultNil : Int?  // declared variable with default nil value
println(defaultNil) >> nil  

var canBeNil : Int? = 4
println(canBeNil) >> optional(4)

canBeNil = nil
println(canBeNil) >> nil

println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper

var canNotBeNil : Int! = 4
print(canNotBeNil) >> 4

var cantBeNil : Int = 4
cantBeNil = nil // can't do this as it's not optional and show a compile time error

这是Apple Developer Committee的详细基本教程。

于 2017-03-24T08:47:25.333 回答
3

来自苹果文档:

在值可能不存在的情况下使用选项。一个可选项代表两种可能性:要么有一个值,您可以打开可选项来访问该值,或者根本没有一个值。

C 或 Objective-C 中不存在可选项的概念。在 Objective-C 中最接近的是能够从一个方法返回 nil,否则该方法会返回一个对象,nil 的意思是“没有有效的对象”。</p>

如果您定义一个可选变量而不提供默认值,则该变量会自动为您设置为 nil:

var surveyAnswer: String?

您可以使用 if 语句通过将可选项与 nil 进行比较来确定可选项是否包含值。您可以使用“等于”运算符 (==) 或“不等于”运算符 (!=) 执行此比较。

如果一个可选项有一个值,它被认为是“不等于”nil:

if convertedNumber != nil {
print("convertedNumber contains some integer value.") 
}

一旦您确定可选项确实包含一个值,您可以通过在可选项名称的末尾添加一个感叹号 (!)来访问其基础值。感叹号有效地表示,“<strong>我知道这个可选的肯定是有价值的;请使用它。” 这被称为强制解包可选值

print("convertedNumber has an integer value of \(convertedNumber!).")
于 2017-03-24T08:47:45.247 回答