【问题标题】:Why would you use an optional type for a constant with value?为什么要为带值的常量使用可选类型?
【发布时间】:2024-01-04 05:29:01
【问题描述】:

看看这个声明from Apple document

let optionalInt: Int? = 9

为什么要使用Int? 作为这个常量的类型?您知道它不能是nil,因为您将值 9 分配给它?可选类型的目的(据我了解)是能够保持nil. 在此语句中optionalInt 不需要保持nil。谁能解释一下?

【问题讨论】:

标签: swift swift2 optional


【解决方案1】:

我发现了一个你可以使用它的案例。这有点牵强,但我们开始吧。

使用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 的文档只是一个简单的例子。

【讨论】:

  • 这有点牵强,但在我们找到使用 let x: Int 的更好理由之前? =无论如何,这是迄今为止最好的答案。也许,没有充分的理由。 Apple 只是举了一个不好的例子。
【解决方案2】:

我认为 Apples 文档的这一特定部分旨在简单地说明可选项的概念,仅此而已。他们可能会使用 let 出于良好的习惯,总是从声明 let 属性/变量开始,并且只有在明确需要更改它们的值时才将它们切换到 var

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

【讨论】:

  • 这是正确答案。当您知道值永远不会是 nil 时,创建一个可选项永远不会更好。即使是其他答案中牵强的例子,在需要时使用显式转换也会更好。
【解决方案3】:

几个想法:

假设你有一个方法

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

也许您想定义常量以与方法定义完全匹配。

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

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

let optionalInt: Int? = foo(nil)

【讨论】:

  • 在上面的 foo 例子中,你可以用 Int 常量调用 foo 吗? let nonOptionalInt: int = 9 let fooVal = foo(nonOptionalInt) 如果你不能以这种方式调用 foo,那么 AgRizzo 提供了一个合理的理由来声明一个具有可选值的常量。有人可以评论吗?
  • 我刚刚做了一个实验。对于函数 foo(xValue: Int?),如果你将一个 Int 类型的值作为参数传递给 foo,它仍然可以工作。因此,AgRizzo 没有为我的问题提供正当理由。
  • @AndrewF。 - 我确实给了你两个理由。你可能不喜欢我的理由,但你没有证明我的理由是无效的。您证明了 Int 可以隐式转换为 Optional Int。
最近更新 更多