php - 我仍然无法理解 Optionals

标签 php ios swift

我是 Swift 语言 的新手,在此之前我只从事网络开发。

我试图理解可选值的概念,但每次他们出现一些使用它的情况时,我仍然不明白他们为什么这样做(或者我可能有一点想法,但仍然不确定。)

我读了几篇关于这个的文章,也许我一直对它太困惑而迷路了。

让我们举一些例子。假设我有一个带有用于电子邮件的 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 中

以同样的方式,因为我不能将文本存储到整数中 — 我不能将 nil“存储”到字符串中。

但是对于可选字符串,我可以使用这个“包装器”,它实际上可以“存储”两种类型:字符串或零。这就是常规字符串与可选字符串的区别。正是这个“包装器”能够“保存”这两种类型,直到我需要使用实际值为止。 (现在我当然明白了,nil其实就是没有任何值(value),我只是这样用它来说明这一点)

谢谢大家的帮助!

最佳答案

假设您从 ebay 订购了一台游戏机。你首先看到的不是游戏机,而是一个盒子。因此,在这种情况下,盒子是可选的。让我们把它写下来。

var 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 box 的内容不为空时才调用 play() 方法。缺点是在失败时无法显示错误。

如果您答应您的 friend ,你们将在今天将在这里的游戏机上一起玩,那会怎样呢?您保证游戏机会在盒子里。那就是你使用它的时候:

playstation!.play()

在实际程序中,这种方法的问题在于,如果可选内容为空,您的应用程序将崩溃。使用 ”!”仅当您可以保证它不会为空时(即您在此之前为变量赋值)

因此,总而言之,可选项是其值可以是特定类型(即字符串)或nil 的变量。您不能将 nil 分配给强类型变量。

var a: String?
var b: String

a = nil // this is ok
b = nil // this will not compile

关于php - 我仍然无法理解 Optionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48204261/

相关文章:

php - MySQL 连接两个与其 id 匹配的表

php - CMS 变得简单 : Session getting reset between page views

PHP。从字符串中删除链接

ios - 如何以编程方式显示键盘

ios - Swift 函数中的动态修饰符

php - 将MySQL数据显示到HTML表格中(解释清楚)

ios - 语言更改后应用程序无法启动

ios - 如何在 Swift 中创建单例

ios - UIView 默认属性和自定义属性

ios - 管理方向变化时 Collection View 单元格布局的正确方法