Swift中的非可选变量是否可以为零?

时间:2014-09-16 14:19:38

标签: ios swift optional

我可以在Swift中创建一个普通变量(我的意思是非可选)并为其分配nil值或稍后在应用生命周期中,让它为nil

让我感到困惑,因为与传统的强大编程语言(如Java和C#)相比,它有点奇怪。

3 个答案:

答案 0 :(得分:8)

不,这在设计上是不可能的。文档摘录解释了原因:

  

C或Objective-C中不存在选项的概念。 Objective-C中最接近的是从一个方法返回nil的能力,否则返回一个对象,nil意味着“缺少一个有效的对象。”但是,这仅适用于对象 - 它不适用于结构,基本C类型或枚举值。对于这些类型,Objective-C方法通常返回一个特殊值(例如NSNotFound)来指示缺少值。此方法假定方法的调用者知道有一个特殊值要测试并记得检查它。 Swift的选项让你可以指出任何类型都没有值,而不需要特殊的常量。

您将选项描述为一件坏事,而我在语言中更多地欣赏这些功能之一,因为它可以防止大多数空指针异常错误。

另一个优点是,当一个函数可以返回一个非值(对象C中的引用类型为n,整数为-1等)时,您不必从可能值的范围中选择一个值。某种类型的变量可以有。没有提到调用者和函数/方法必须遵循的约定。

最后,如果您在代码中使用了太多问题和惊叹号,那么您应该考虑选项是否真的适合该问题(感谢 @David 提示),或者在真正需要选项的所有情况下更频繁地利用可选绑定。

建议阅读:Optionals

<强>附录

提示:我经常看到在声明变量的情况下使用选项,但无法在上下文中初始化。非可选的可变变量不需要在同一行中声明和初始化 - 允许延迟初始化,前提是该变量在初始化之前未使用。例如:

var x: Int // Variable declared here

for var counter = 0; counter < 10; ++counter {
    println(counter)
}

var array = [1, 2, 3]

// ... more lines of code NOT using the x variable

x = 5 // Variable initialized here

print(x)

希望此功能可以让您从代码中删除多个选项...

答案 1 :(得分:4)

  

我可以在SWIFT中创建一个普通变量(我的意思是非可选)并为其分配一个零值或稍后在应用程序生命周期中,让它为零。

没有

这在操场上很容易测试:

var str = "Hello, playground"

str = nil

第二行会出现此错误:

  

类型'String'不符合协议'NilLiteralConvertible'

您可能希望详细了解Swift Literal Convertiblessee an example of how to use it

答案 2 :(得分:3)

你是对的,你不能将非可选设置为nil,虽然这看起来像是一个负担,但你通过提供一点点灵活性来获得很多安全性和可读性。一旦你习惯了它,你会越来越欣赏它。