Swift - 使用let可选

时间:2015-04-15 23:35:25

标签: swift initialization constants optional

我正在学习Swift。在第一印象中,我无法看到任何声明常量(没有初始存储值)作为类中的可选项的点...例如

let userName: String?

因为默认的初始值设定项会将其指定为nil,并且随后无法更改(因为它是常量)。

据我了解,自定义初始化程序仍然可以为其指定一个非零值,但在这种情况下,您不会将其声明为let userName: String(即非可选)

我原本以为如果它是一个多余的模式,苹果会提到它,但我不能看到它们......所以在什么情况下可以使用可选的常量声明或有用?

3 个答案:

答案 0 :(得分:21)

在init过程中需要为可选项指定值的常量。该值可以是零或其他值。一旦分配,它就会陷入该值。一个零就像一个"这个属性故意留空"指示牌,用永久墨水书写。

假设您有一个充满来自网络请求的响应数据的类。您获得的某些字段可能为零,或者它们可能包含数据。

您编写的代码解析来自服务器的响应并构建响应对象。响应对象的每个属性都是固定的。如果您获得该属性的信息,则它包含数据,或者为nil。

在这种情况下,使用可选常量非常有意义。

您为响应对象编写了一个init方法,该方法将接受网络回复(例如,在JSON中)并填写响应对象的属性。如果缺少JSON数据中的给定标记,则将该属性设置为nil。您使用常量,因为一旦响应对象初始化,该值就会被修复。如果它没有,它将永远是零。如果它包含一个值,它将始终包含该值,并且无法更改。

答案 1 :(得分:3)

如果您正在放置文字并将其设为可选,则可选部分无用,因为您知道number将是1

let number: Int? = 1

但是,如果你想制作另一个对象的常量副本,你不知道来源是否为零,那就是。

var array = ["hello"]
let string: String? = array[1]

// string is nil, so you can do some checking with it

上面的示例并没有完全说明我的观点,但假设array是一个可变数组,您可能会偶尔删除并偶尔添加值(如果您正在检查,则可能会获得零值) " 1"索引)

答案 2 :(得分:2)

如果没有提供初始值,则只有可选变量会自动设置为nil

T型可选常量?不会自动设置为零 它需要使用类型为T或nil

的值手动初始化
  • 如果在使用前没有手动初始化,则会抛出“初始化前使用的常量”错误

  • 同样,如果一个类没有显式的可选常量属性,手动初始化它也没有构造,则会抛出错误“class has no initialisers”