【问题标题】:Why can I declare a variable without writing optional mark?为什么我可以声明一个变量而不写可选标记?
【发布时间】:2015-12-19 05:00:36
【问题描述】:

首先,我相信我的问题与那些关于“什么是 swift 中的可选”的问题不同。因为我问的是为什么我能做到这一点,而不是这是什么。

我是 swift 新手。当我今晚学习这门美妙的语言时,我遇到了一个我从未在编程语言中看到过这个标记的问题——“?”。我搜索了一段时间。我现在知道什么是可选绑定了。

但现在我有一个新问题。 当我想声明一个不是可选的变量时。我可以写这样的语法:

var friend: String

但我不会写:

var friend: String = nil

要声明一个为零的变量,我只能使用可选的:

var friend: String? = nil

让我们看看第一段代码。当新变量friend刚刚被声明时,它的值是nil,对吧?因为我没有给它赋值。但是根据 optional 的定义,像第二段和第三段代码一样,我们不能将 nil 分配给非可选变量。

所以我的问题是为什么我可以声明一个没有可选标记但没有初始值的变量。这个问题可能很简单,但我真的不知道为什么会这样。

提前致谢!

【问题讨论】:

  • 第一个不为零。它是一个未初始化的变量。就像 Marc 所说的,如果你尝试运行第一个,你会得到一个编译时错误。但是,如果它是可选的。它将允许您运行它,因为它的值为 nil。

标签: ios swift optional


【解决方案1】:

Swift 允许您声明一个非可选变量或常量,而无需在声明中对其进行初始化,但您必须在使用前为其赋值。变量或常量的值是 not nil(非可选值永远不能是 nil)——它只是没有定义的值。基本上你是说你稍后会给它一个值,可能基于计算结果或 if 语句。

如果您尝试使用非可选变量或常量而不首先为其赋值,Swift 会给您一个编译时错误。

【讨论】:

  • 非常感谢!我以前不知道。我认为它就像 C++,当我声明一个新变量而不初始化它时,它为 null(在 C++ 中为 0)。再次感谢。
  • 很高兴它有帮助!请注意,如果您不给它们一个值,则在 Swift 中选项会自动初始化为 nil。另外,请注意,在 C++ 中,只有 一些 类型的变量(如全局变量)会自动初始化,而其他类型(如局部变量)则处于未定义状态。见this question for a rundown
【解决方案2】:

你设置的第一个值是字符串类型的未初始化变量。

编程中一个非常常见的模式是有一个可能返回值也可能不返回值的操作。在某些语言中,例如 javascript,当遇到空值时,只要我们的程序不依赖该值继续运行,我们的程序就会继续正常运行。在其他语言中,例如 java,null 值可能导致 NullPointerException 并使我们的程序崩溃。

Swift 对这个问题的解决方案是可选的。默认情况下,如果我们定义一个没有值的变量,编译器会报错。因此,为了声明一个在运行时可能有也可能没有值的值,我们需要添加一个 ?这被称为“将我们的值包装在一个可选项中”。这是因为我们确实将我们的值包装在 Swift 的可选类型中,从而赋予它价值。为了更好地了解发生了什么,我们可以看看 Swifts Optional enum 是如何实现的。

enum Optional<T> {
    case None // has no value
    case Some(T) // has some value
} 

【讨论】:

  • 感谢您的回复。你的回答真的很有帮助。你谈到了其他一些语言。现在我越来越喜欢swift了。)
  • 没问题,Swift 确实是一门简洁的语言,现在由于它是开源的,我们实际上可以将其视为一种服务器端语言。
  • 但是为什么是服务器端呢?我刚开始学习 Swift。我看到一些文件说swift有两个主要部分,UIKIT和cocoa。我们可以使用 UIKIT 做很多 UI 设计。如果我误解了,请告诉我。
  • 你做到了。服务器端代码类似于 PHP 或 ASP.NET。我基本上是说我想在服务器上使用 Swift,现在它是开源的,我们可能会看到。 @JW.ZG
猜你喜欢
  • 1970-01-01
  • 2020-05-16
  • 2016-04-26
  • 1970-01-01
  • 2016-09-18
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多