"可选,可以是字符串"或"可选的字符串"?

时间:2015-04-09 01:58:21

标签: swift optional

通过最新的斯坦福iOS开发课程视频(现在使用Swift而不是Objective-C),主持人在首次引入选项时似乎做了大量工作(讲座1,在初始计算器演示中)。

代码行如下:

let digit = sender.currentTitle

其中senderUIButton,并且正确地指出digit的类型设置为String?

现在我理解在C#中使用可空类型的选项的概念(以及使用结构在C中手动创建的变体)。

但是主持人强调 你应该认为String?类型是可选的,并且它可能包含一个字符串。您应该将其视为可能是nil的字符串。

对我来说,这种区别似乎是人为的,除非你在讨论它是如何在封面下实施的。就语言本身而言,我对你描述它的方式感到矛盾。

但是,由于我只是开始使用该语言,我的问题是这个。有什么理由为什么以某种方式考虑它更为正确?

我不是在寻找意见,而是想知道是否有一些我还没有达到的基本语言功能或方面,实际上要求我们将类型视为“可选但可能是一个字符串“。

2 个答案:

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