"Optional that can be string" 还是 "String that is optional"?

"Optional that can be string" or "String that is optional"?

翻阅最新的斯坦福 iOS 开发课程视频(现在使用 Swift 而不是 Objective-C),演示者在首次介绍选项时似乎很重要(讲座1、在最初的计算器演示中)。

这行代码是这样的:

let digit = sender.currentTitle

其中sender是一个UIButton,正确指出digit的类型设置为String?

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

但是演示者强调您应该考虑 String? 类型是可选的,并且它可以包含一个字符串。你应该而不是把它看成一个可能是nil.

的字符串

对我来说,这种区别似乎是人为的,除非你在谈论它是如何在幕后实现的。就语言本身而言,我对您描述它的方式感到矛盾。

但是,由于我才刚刚开始学习这门语言,所以我的问题是这样的。是否有某种原因可以解释为什么以一种或另一种方式考虑它更正确?

我不是在征求意见,而是想知道是否有一些基本的语言特性或方面我还没有做到,这真的需要我们将类型视为"optional but may be a string".

But the presenter states emphatically that you should consider the String? type to be optional, and that it may hold a string.

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

You should not think of it as a string that may be nil.

是的。如果函数接受 String 作为参数,则不能向它传递 String? 类型的变量。你必须在使用它之前打开那个可选的,也就是说,如果容器(可选)不为空(nil),你需要打开容器并取出内容(String)。

显然可选值是作为 Swift 枚举实现的。枚举值之一是 .Some(具有通用类型 T 的关联值)和 .None 值(其中值固定为 nil,并且没有关联值。

因此可选不是可以指向地址零的指针,它是一个具有 2 个状态的枚举,一个 none 状态和一个存储其他值的状态。当它处于 None 状态时,它没有任何值。

如果您考虑使用可选项来存储 Int,那么区别就很明显了。

nil 值几乎总是保存为零。

假设我们有一个变量:

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 has the value 0.

如果您改为分配

anInt = nil

那么显示的就是

anInt has no value