Swift &引用;可选,可以是string";或;可选的字符串";?
通过查看最新的斯坦福iOS开发课程视频(现在使用的是Swift而不是Objective-C),演示者在第一次介绍optionals时似乎做了一件大事(第一堂课,在最初的计算器演示中) 代码行类似于:Swift &引用;可选,可以是string";或;可选的字符串";?,swift,optional,Swift,Optional,通过查看最新的斯坦福iOS开发课程视频(现在使用的是Swift而不是Objective-C),演示者在第一次介绍optionals时似乎做了一件大事(第一堂课,在最初的计算器演示中) 代码行类似于: let digit = sender.currentTitle 其中,sender是一个ui按钮,并且正确地指出,数字的类型设置为字符串? 现在我理解了optionals在C#中使用可空类型(以及在C中使用结构手动创建变体)的概念 但是,演示者强调,你应该考虑字符串> 类型是可选的,并且它可以保存
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
那么将显示的是
没有价值
这里让人困惑的是,在ObjCnil
中表示“不指向任何东西”,而在Swift中表示“指向。选项的枚举值为None
类型。在处理任何一种语言时,您都需要在它们之间进行心理翻译。实际上,无法使用字符串
和字符串代码>互换性是一个很好的观点,表明后者不是前者的变体(一个可以为零的字符串)。但我的第一个想法是,它们是两个完全不相关的类型,这也是不可能的,因为它们在某种意义上是相关的,你可以将一个从另一个中拆开。回答得好。
anInt = nil