我仍然无法理解Optionals

时间:2018-01-11 10:00:50

标签: php ios swift

我是 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区分开来的原因。正是这个“包装器”能够“保持”这两种类型,直到我需要使用实际值。 (现在我明白了,那个零实际上是没有任何价值。我只是用这种方式来说明这一点)

谢谢大家的帮助!

4 个答案:

答案 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课程。我可以更好地解释选项。