我是 Swift语言的新手,直到此时我才在网络开发中工作。
我试图掌握选项的概念,但每次他们都会出现使用它的情况时,我仍然无法理解为什么会这样做(或者我可能会有一点想法,但仍不确定。)
我读过几篇关于此事的文章,也许我对此一直感到困惑并迷路了。
让我们举一些例子。假设我有一个带有 textfield 的注册表单,用于发送电子邮件。发送表单后,在PHP中我可以执行以下操作:
$mail = $_POST['mail'];
if($mail == "") {
echo "ERROR: The E-mail is empty";
} else {
// Do something more
}
如果textfield为空,$ _POST ['mail']的值为空字符串。我可以使用它并检查它是否为空。
现在,如果我理解正确,在swift中,该textfield的值不会是空字符串,但实际上是零,对吗?这有什么不同,为什么我们需要选项?因为与PHP相比,在Swift中我必须每次声明该信息的类型,并且它不知道该textfield是否传递字符串或数字?
我们来谈谈另一个例子。 swift 中的很多人只是声明一个字符串作为可选字符串,即使它们在其中放置了一个值,如下所示:
let name:String? = "Gabriel"
如果它已有值,为什么要将它作为可选项呢?对我来说,它只是一个带有值的常规常量,我没有看到将它包装成可选的。
如果我不知道声明中的名字,为什么我不能直接输入?
let name:String = ""
之后,我可以使用if语句检查它是否为空
if name == "" {
print("ERROR: name is empty")
} else {
//Do something else
}
我是否正确地了解了文本字段? 有什么我想念的吗?
感谢您的帮助!
编辑(让我了解这个概念的原因):
我最困惑的是一个简单的事实,例如 String只能存储“text”,如果nil是某种东西,它就不会是String类型,所以因此当然不能“存储”在String中。
以同样的方式,因为我无法将文本存储到整数 - 我无法将nil存储到字符串中。
但是使用Optional String我可以使用“wrapper”,实际上 CAN “存储”两种类型:string或nil。这就是将常规String与Optional String区分开来的原因。正是这个“包装器”能够“保持”这两种类型,直到我需要使用实际值。 (现在我明白了,那个零实际上是没有任何价值。我只是用这种方式来说明这一点)
谢谢大家的帮助!
答案 0 :(得分:3)
想象一下,你从ebay订购了一个PlayStation。你看到的第一件事不是PlayStation,而是一个盒子。因此,在这种情况下,该框是可选的。我们把它写下来。
var playstation: Playstation?
盒子当然可以是空的。为了使用PlayStation,我们需要打开盒子。我们有几种方法可以做到这一点。
安全的方式:
if let ps = playstation {
// if the box is not empty, and the PS is there
ps.play()
} else {
print("The box was empty :(")
}
另一种方式:
playstation?.play()
在另一个场景中,如果playstation框的内容不为空,我们只调用play()方法。缺点是,如果失败,您将无法显示错误。
如果你答应你的朋友,你将在今天将在这里的游戏机上一起玩,该怎么办?你保证PlayStation将在盒子里。那是你用的时候:
playstation!.play()
在实际程序中,这种方法的问题在于,如果可选内容为空,您的应用程序将崩溃。使用 ”!”只有当你可以保证它不会为空时(即你在此之前为变量赋值)
因此,总而言之,选项是变量,其值可以是特定类型(即String)或 nil 。您不能将 nil 分配给强类型变量。
var a: String?
var b: String
a = nil // this is ok
b = nil // this will not compile
答案 1 :(得分:2)
想想像这样的选项:
可选项是一个变量,在将来甚至现在都可能是空的。
将变量设为可选意味着包装为枚举。
假设有一个变量:var x : Int?
,这意味着名为x的Int类型的变量尚未初始化且是可选的。
这通常可以用外行术语表示为
Enum x(optional) // name of the variable{
case T: // some value
case nil: // no value
}
因此,当我们分配变量时,我们可以正常分配它,但该值存储在x 的可选枚举变量的情况T中。
x = 10 //
enum x(optional){
case T = 10
case nil
}
当我们想要使用它时(获取值)我们使用(?)或(!)
这些可以进一步解释为
print(x?)
// 如果x中有任何值,请将它交给我(在这种情况下,给我x的值为T的值)
print(x!)
// 我不在乎x内是否有任何价值,无论如何都要把它交给我。
因此,如果x没有值,则print(x!)将产生崩溃,因为x内部没有值。
?
- 安全展开可选
!
- 强行展开可选
P.S - 我知道有些事情我错过了,但这是可选的这个主旨是出于解释目的。一旦掌握了这个概念,您就可以在Apple的文档here
上查看更多文档答案 2 :(得分:0)
有效地,
let name:String? = "Gabriel"
不是很有用。 但
var name:String? = "Gabriel"
确实有意义,因为你可以进一步设置为nil。
Optionals对于从函数返回值非常有用。 考虑一个返回Int。
的函数如果未找到该值,您可以返回一个数字(如非常大的负数)以找不到通知值。但有一天,func确实会返回这个值(甚至不太可能)。 返回一个nil让函数清楚地表明它没有找到值。
答案 3 :(得分:0)
我对选项的理解是它们是一个类似String,Int或Double的类型。 Optionals有关联的值,所以String?是一个可选项,带有与之关联的String。可选的可以包含一个值,它是一个字符串,甚至是一个空字符串,或者根本没有,这对我来说是空的。查看iTunes上的Stanford U IOS课程。我可以更好地解释选项。