通过最新的斯坦福iOS开发课程视频(现在使用Swift而不是Objective-C),主持人在首次引入选项时似乎做了大量工作(讲座1,在初始计算器演示中)。
代码行如下:
let digit = sender.currentTitle
其中sender
是UIButton
,并且正确地指出digit
的类型设置为String?
。
现在我理解在C#中使用可空类型的选项的概念(以及使用结构在C中手动创建的变体)。
但是主持人强调 你应该认为String?
类型是可选的,并且它可能包含一个字符串。您应该不将其视为可能是nil
的字符串。
对我来说,这种区别似乎是人为的,除非你在讨论它是如何在封面下实施的。就语言本身而言,我对你描述它的方式感到矛盾。
但是,由于我只是开始使用该语言,我的问题是这个。有什么理由为什么以某种方式考虑它更为正确?
我不是在寻找意见,而是想知道是否有一些我还没有达到的基本语言功能或方面,实际上要求我们将类型视为“可选但可能是一个字符串“。
答案 0 :(得分:4)
显然,选项是作为Swift枚举实现的。其中一个枚举值是.Some(具有泛型类型T的关联值)和.None值(其中值固定为nil,并且没有关联值。
因此,一个可选的isn指针可以指向零地址,它是一个具有2个状态的枚举,一个无状态,以及一个存储其他值的状态。当它处于无状态时,它不会保持任何值。
如果您考虑使用可选项来存储Int。
,则区别变得清晰零值几乎总是保存为零。
让我们说我们有一个var:
var anInt: Int?
因此,如果Int可以保存一个值,或者nil,那么
之间会有什么区别anInt = 0
和
anInt = nil
答案:没有区别。如果nil是一个值,并且该值为零,则无法区分无值和零值。
但是,如果选择,则存在差异。
你可以说:
anInt = 0;
if (anInt == nil)
{
println("anInt has no value"
}
else
{
println("anInt has the value \(anInt)")
}
将显示的内容是
anInt的值为0.
如果您指定
anInt = nil
然后将显示的是
anInt没有价值
答案 1 :(得分:2)
但是主持人强调说你应该考虑一下 串? type是可选的,并且它可以包含一个字符串。
是。可选的是一种不同的类型。它是一个可能为空(nil
)的容器,或者可以保存为其命名的类型(例如String
)。您必须打开容器(打开可选项)才能使用它。
你不应该把它想象成一个可能是零的字符串。
是。如果函数将String
作为参数,则不能将其传递给String?
类型的变量。您必须在使用之前解开该可选项,也就是说,如果容器(可选)不为空(String
),则需要打开容器并删除内容(nil
)。