【发布时间】:2018-01-12 04:03:08
【问题描述】:
我是 Swift 语言 的新手,在此之前我只从事 Web 开发。
我试图掌握可选项的概念,但是每次他们提出一些使用它的情况时,我仍然无法理解他们为什么这样做(或者我可能有一点想法,但仍不确定。)
我阅读了几篇关于此的文章,也许我只是在此过程中太困惑而迷路了。
让我们举一些例子。假设我有一个带有 textfield 的电子邮件注册表单。发送表单后,在 PHP 中我可以执行以下操作:
$mail = $_POST['mail'];
if($mail == "") {
echo "ERROR: The E-mail is empty";
} else {
// Do something more
}
如果文本字段为空,则 $_POST['mail'] 的值为空字符串。我可以使用它并检查它是否为空。
现在,如果我理解正确,那么该文本字段的值很快就不会是空字符串,而实际上是 nil,对吧?这就是我们需要选项的区别吗?因为与 PHP 相比,在 Swift 中我每次都必须声明该信息的类型,并且它不知道该文本字段是传递字符串还是数字?
让我们谈谈另一个例子。 swift 中的很多人只是将一个字符串声明为可选,即使他们在其中输入了一个值,如下所示:
let name:String? = "Gabriel"
如果它已经有一个值,那为什么还要让它成为可选的呢?对我来说,它只是一个带有值的普通常量,我看不出将它包装成可选项的意义。
如果我不知道声明中的名称,为什么不能直接输入?
let name:String = ""
然后,我可以使用 if 语句来检查它是否为空
if name == "" {
print("ERROR: name is empty")
} else {
//Do something else
}
我对文本字段的想法是否正确? 我有什么遗漏吗?
感谢您的帮助!
编辑(是什么让我理解了这个概念):
我最困惑的是一个简单的事实,例如 String 只能存储“文本”,如果 nil 是什么,它就不是 String 类型,所以因此 它当然不能“存储”在 String 中。
同样,我不能将文本存储到整数中——我不能将零“存储”到字符串中。
但是使用可选字符串,我可以使用这个 "wrapper" 实际上 CAN “存储”两种类型:字符串或 nil。这就是常规字符串与可选字符串的区别。正是这个“包装器”能够“持有”这两种类型,直到我需要使用实际值。 (现在我当然明白了,nil 实际上是没有任何值的。我只是这样用它来说明这一点)
感谢大家的帮助!
【问题讨论】:
-
可选意味着该值在某些时候可以是
nil,即使您在声明时赋予它值,并且在读取时您必须检查它是否为 nil 或具有值,非可选意味着它永远不能是nil,如果 nil 并且读取它会崩溃 -
但是检查 nil 与检查空值的问题是一样的。要检查字符串是否为空或 Int == 0,就像我可以检查某些东西是否 == nil 一样,我不需要选项,只需要一个 if 语句。
-
不同的是,0 不是 nil,0 表示值为 0,nil 表示它在物理内存中根本没有任何值,只是一个空指针