【问题标题】:Swift - use of optional with letSwift - 使用可选的 let
【发布时间】:2015-06-22 03:47:51
【问题描述】:

我正在学习 Swift。在第一印象中,我看不出将常量(没有初始存储值)声明为类中的可选项

例如:

let userName: String?

因为默认初始化程序会将其分配给nil,并且随后无法更改(因为它是一个常量)。

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

我原以为如果这是一种冗余模式,Apple 会提到它,但我看不出他们有。那么在什么情况下Optional 常量声明会被使用或有用呢?

【问题讨论】:

  • 假设您有一个用户通过电子邮件注册的应用,他们可以选择性地输入用户名。并且您想将两条信息都传递给下一个控制器。下一个控制器知道这些值在其生命周期内都不会改变,但 userName 是可选的。因此,您将其声明为String?

标签: swift initialization constants optional


【解决方案1】:

如果你输入一个字面量并将其设为可选,那么可选部分是无用的,因为你知道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”,您可能会得到一个 nil 值索引)

【讨论】:

  • 一个更好的例子是let string: String? = array.first。如果数组不包含 2 个对象,表达式 array[1] 将崩溃,如果数组为空,array.first 返回一个包含 nil 的可选项。
【解决方案2】:

一个可选的常量需要在初始化过程中被赋值。该值可以为 nil,也可以为其他值。一旦分配,它就会停留在该值中。 nil 类似于“此属性故意留空”指示符,用永久性墨水书写。

假设您有一个类,其中填充了来自网络请求的响应数据。您返回的某些字段可能为 nil,或者它们可能包含数据。

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

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

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

【讨论】:

  • 超级@Duncan C,喜欢你解释的方式!!
【解决方案3】:

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


T 类型的可选常量?不会自动设置为 nil
它需要手动初始化为 T 或 nil 类型的值

  • 如果在使用前没有手动初始化,会抛出“constant used before being initialized”的错误

  • 1234563

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多