"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
翻阅最新的斯坦福 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