Swift &引用;可选,可以是string";或;可选的字符串";?

Swift &引用;可选,可以是string";或;可选的字符串";?,swift,optional,Swift,Optional,通过查看最新的斯坦福iOS开发课程视频(现在使用的是Swift而不是Objective-C),演示者在第一次介绍optionals时似乎做了一件大事(第一堂课,在最初的计算器演示中) 代码行类似于: let digit = sender.currentTitle 其中,sender是一个ui按钮,并且正确地指出,数字的类型设置为字符串? 现在我理解了optionals在C#中使用可空类型(以及在C中使用结构手动创建变体)的概念 但是,演示者强调,你应该考虑字符串> 类型是可选的,并且它可以保存

通过查看最新的斯坦福iOS开发课程视频(现在使用的是Swift而不是Objective-C),演示者在第一次介绍optionals时似乎做了一件大事(第一堂课,在最初的计算器演示中)

代码行类似于:

let digit = sender.currentTitle
其中,
sender
是一个
ui按钮
,并且正确地指出,
数字
的类型设置为
字符串?

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

<>但是,演示者强调,你应该考虑<代码>字符串> <代码>类型是可选的,并且它可以保存一个字符串。您不应将其视为可能为
nil
的字符串

对我来说,这种区别似乎是人为的,除非你谈论的是如何在幕后实现它。就语言本身而言,我不确定你会用什么方式来描述它

但是,由于我才刚刚开始学习这门语言,我的问题是。有没有一个理由来解释它为什么更正确? <>我不是在寻找意见,而是想知道是否有一些基本的语言特征或方面我还没有达到,这确实需要我们把这个类型看作是“可选的,但可能是一个字符串”。 但是主持人强调你应该考虑一下。 一串类型是可选的,并且可以包含字符串

对。可选类型是一种独特的类型。它是一个容器,可以是空的(
nil
),也可以包含其命名的类型(例如
String
)。您必须打开容器(打开可选包装)才能使用它

您不应该将其视为可能为零的字符串


对。如果函数以
String
作为参数,则不能向其传递
String?
类型的变量。在使用该可选项之前,必须先打开它,也就是说,如果容器(可选项)不是空的(
nil
),则需要打开容器并删除内容(字符串
)。枚举值之一是.Some(具有泛型类型T的关联值)和.None值(其中该值固定为nil,并且没有关联值)

因此,可选的不是指向地址零的指针,而是一个有2个状态的枚举,一个无状态,一个存储其他值的状态。当它处于无状态时,它不包含任何值

如果您考虑使用一个可选的函数来存储一个Int,那么区别就会变得很明显

nil值几乎总是保存为零

假设我们有一个变量:

var anInt: Int?
那么如果一个Int可以保存一个值,或者nil,那么它们之间的区别是什么呢

anInt = 0

答:没有区别。如果nil是一个值,而该值为零,则无法区分无值和零值

但是,对于可选的,有一个区别

你可以说:

anInt = 0;
if (anInt == nil)
{ 
  println("anInt has no value"
}
else
{
   println("anInt has the value \(anInt)")
}
将要展示的是

anInt的值为0

如果您指定

anInt = nil
那么将显示的是

没有价值


这里让人困惑的是,在ObjC
nil
中表示“不指向任何东西”,而在Swift中表示“指向
选项的
枚举值为None
类型。在处理任何一种语言时,您都需要在它们之间进行心理翻译。实际上,无法使用
字符串
字符串互换性是一个很好的观点,表明后者不是前者的变体(一个可以为零的字符串)。但我的第一个想法是,它们是两个完全不相关的类型,这也是不可能的,因为它们在某种意义上是相关的,你可以将一个从另一个中拆开。回答得好。
anInt = nil