你什么时候使用obj!.attr和obj?.attr?

时间:2014-09-19 08:00:44

标签: swift optional

  • 如果obj不存在,obj?也会生成nil obj?.attr
  • 如果obj为零,则obj!.attr崩溃。

但是,如果我确信obj代码的某一点始终存在,那么对我而言,它似乎是独立的。我对吗?你使用什么编码风格?

3 个答案:

答案 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