何时使用?,!,None或Lazy?

Aeo*_*Neo 12 iphone variables optional ios swift

我刚刚开始学习Swift,最近发现了

  1. "正常"变量(缺少更好的名称):

    例如: var test1: String

  2. "可选"变量

    例如: var test2: String?

  3. "隐式解包的选项"

    例如: var test3: String!

  4. 懒惰的变量

    例如: lazy var test4: String

我的理解是这样的:

  1. 当变量可能会或可能不会在将来从初始化开始的点初始化时,使用"可选"变量(?)

  2. 保证初始化变量时,使用"隐式解包选项"(!)

  3. Optionals可以通过"Forced Unwrapping"转换为Implicitly Unwrapped Optionals

    例如: let possibleString: String? = "Hello" println(possibleString!)

  4. 在初始化之前不需要设置某些东西时使用"惰性变量"(似乎这些变量可以与(?)或(!)一起使用)

因此,我的问题是:

  1. 我什么时候使用选项1 - 没有变量?没有!

  2. 我什么时候用"懒"

  3. 我读"懒"经常用于单身人士 - 为什么?

我对Java和C++术语有最丰富的经验,如果这有助于我的回答背景.

编辑:这是我找到的所有内容(主要问题是"正常""隐式解包的选项":

  1. 必须初始化"正常"变量:(a)在同一行,(b)在使用前的相同范围内(使用意味着对对象的一些操作),(c)在init结束时iff变量是一个字段.注意:init的范围是类的范围内的所有内容,而不是类中函数的范围.
  2. 打印Implicitly Unwrapped Optional将打印"nil",但使用变量的函数将抛出运行时异常.同时,使用(完全包括打印)Normal变量将不允许程序编译
  3. 使用目的!over""(Nothing)是(a)更宽松,因为程序将编译(并且在变量实际初始化的情况下正确运行)和(b)允许您不要在一开始就初始化所有内容.注意:如果它是Normal变量,则任何字段都是未声明的,这是编译时错误.

cou*_*elk 2

不完全是这样。

所有变量必须在首次使用之前初始化,并且所有类/结构存储的属性必须在各自的初始化程序中分配值。可选项并不是允许在某个时刻未初始化,而是允许不包含任何值,这由 表示nil,这仍然是此类变量的完美初始化声明。因此,如果在初始化时无法知道某些内容,那么您可能会使用某种可选选项(例如视图的委托)。

隐式解包选项是变量可能为空的情况的一种简写,但我们绝对确定当我们真正使用它时,它将保存一个实际值(典型的例子是视图控制器中的一个属性,它保存对一个看法)。

强制解包不会将可选值转换为隐式解包可选值,而是为您提供一个存在的值(如果该值存在)(即,如果不存在可选值nil),如果不存在则抛出异常。

当您希望将其初始化推迟到稍后阶段(当该属性实际上是第一次使用时)时,可以使用惰性属性。通常的情况是,如果您需要访问昂贵的资源来执行此操作(从磁盘加载大文件,通过网络下载等),特别是如果可能存在根本不会使用此类属性的情况(为什么要加载如果我们不会使用它,它可能会从磁盘中取出?)。