obj
不存在,obj?
也会生成nil
obj?.attr
。obj
为零,则obj!.attr
崩溃。但是,如果我确信obj
代码的某一点始终存在,那么对我而言,它似乎是独立的。我对吗?你使用什么编码风格?
答案 0 :(得分:2)
我个人认为,如果您确定 obj 存在,您可以使用!要么 ?无论是。它们对现有对象产生相同的效果。唯一的问题是编译器:有时它可以使用!而不是?,有时不是。
无论如何,如果你想进一步阅读这篇文章,请给予Apple" The Swift Programming Language"的免费书籍机会:这些事情在那里得到了很好的解释!
答案 1 :(得分:1)
如果obj
存在,即使obj?.attr
不是可选项,attr
也会返回可选类型。另一方面,obj!.attr
将是attr
的任何类型,因此如果attr
是非可选的,则不需要额外的展开。
考虑这个例子:
class Person {
var age = 37
}
var fred: Person? = Person()
let ageNextYear = fred?.age + 1 // error: value of optional type Int? not unwrapped
let ageLastYear = fred!.age - 1 // this works
答案 2 :(得分:0)
没有任何关系,价值是否为零。
由于Swift是类型安全的,它需要所有变量和常量默认值始终保持一个值,这意味着它们有一个类型。那么定义一些东西?要么 !在它周围放一个包装。
enum Optional {
case None
case Some(T)
}
如你所见它或者是否有类型。没有(如果可能的话)或者没有与它没什么关系。但是没有关联类型的所有东西通常都是零。
当您处理声明为可选的变量的值时,您需要使用它来展开它!否则你会使用上面显示的枚举。
展开意味着你可以断言它确实持有一个值,意味着它有一个类型。它将它从枚举中取出并呈现它作为类型的值。
关于编码风格,您通常只需要声明某些内容?使用C或Objective-C API时。在纯粹的Swift中,你通常不会声明某些东西是可选的。
您可能需要使用!即使是在没有定义某些东西的情况下也是如此。例如,您具有初始化为空的多维数组。这是因为Swift当前处理真正的多维对象,其中较高维度是隐式选项。
TL; DR:不要使用?除非你在处理C / Obj-C API时被迫使用。使用声明的变量的值时?总是用!引用价值而不是?。
一些链接可以更详细地解释发生的事情:
http://www.drewag.me/posts/what-is-an-optional-in-swift
http://www.drewag.me/posts/uses-for-implicitly-unwrapped-optionals-in-swift