为什么要为具有值的常量使用可选类型?

时间:2016-03-03 14:34:43

标签: swift swift2 optional

看一下这句话from Apple document

let optionalInt: Int? = 9

为什么要使用Int?作为此常量的类型?您知道它不能是nil,因为您要为其分配值9吗?可选类型的目的(据我所知)是能够保留nil. optionalInt在此语句中不需要nil。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:5)

我找到了一个可以使用它的案例。这有点紧张,但我们走了。

使用let x: Int? = whatever的一个原因是,如果您有一个重载函数,其中参数是不同类型,只要一个是可选的。例如:

func doSomething(x: Int)
{
    print("\(x) is an Int")
}

func doSomething(x: Int?)
{
    print("\(x) is an optional")
}

如果要确保调用第二个重载,则需要将参数显式设置为可选,例如

let y = 5
doSomething(y) // prints 5 is an Int

let z: Int? = 6
doSomething(z) // prints Optional(6) is an optional

我现在还没有在现实生活中看到这样的事情。

关于Apple文档,它只是一个简单的例子。

答案 1 :(得分:3)

我认为苹果文档的这一特定部分旨在简单地说明选项的概念而不是其他内容。他们可能会使用let的优良做法总是从声明let属性/变量开始,只有在明确需要更改其值时才将它们切换为var

关于为什么会宣布let foo: Int? = 9而不只是let foo = 9的问题。好吧,我真的无法想象它会在哪里需要。即使某些API需要Int?,您仍然可以将Int类型的变量传递给此类API,Swift会隐式转换它。也许,如果你把它传递给一个泛型函数,并且你想要使用该泛型的Int?版本,那么你就会想要这样做,但是它已经过于学术化,已经具备实际用途。

答案 2 :(得分:1)

一些想法:

假设你有一个方法

func foo(xValue: Int?)->Int? {
  // some logic
}

也许你想定义你的常量以完全匹配方法定义。

let optionalInt: Int? = 9
let fooVal = foo(optionalInt)

或(更改您的初始let语句),常量的值由返回Optional的函数确定

let optionalInt: Int? = foo(nil)
相关问题