看一下这句话from Apple document:
let optionalInt: Int? = 9
为什么要使用Int?
作为此常量的类型?您知道它不能是nil
,因为您要为其分配值9吗?可选类型的目的(据我所知)是能够保留nil.
optionalInt
在此语句中不需要nil
。有人可以解释一下吗?
答案 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)