【问题标题】:Swift interpreter complaining about type castingSwift 解释器抱怨类型转换
【发布时间】:2020-06-25 21:42:08
【问题描述】:

为什么解释器会抱怨下面的代码?

let interestingNumbers:[String: Array<Int>] = [
    "Prime": [2, 3, 5, 7, 223, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]

let r: Array<Int> = interestingNumbers["Prime"]

可选类型“[Int]?”的值必须解包为类型的值 '[整数]'

【问题讨论】:

  • 没有 Swift 解释器。 Swift 的唯一实现(据我所知)是开源 Apple 实现(通过 LLVM 编译)和 RemObjects Silver(交叉编译到 CLR、JVM、WebAssembly 或其他几个目标)。跨度>

标签: swift casting


【解决方案1】:

访问interestingNumbers["Prime"] 会返回一个可选[Int]?,而不是您声明的[Int]

这是因为您不知道字典是否包含键 - 它可能会丢失(然后返回值是 nil)。因此,访问字典值会返回一个 可选 值。

你可以强制解开它:

let r: [Int] = interestingNumbers["Prime"]!

或提供默认值:

let r: [Int] = interestingNumbers["Prime"] ?? [] // some default value if the key is missing
let r: [Int] = interestingNumbers["Prime", default: []] // some default value if the key is missing

或将r 设为可选:

let r: [Int]? = interestingNumbers["Prime"]

另外,Swift 可以自动推断表达式的类型,这意味着不需要(通常)显式指定类型:

let r: [Int] = interestingNumbers["Prime"]!

如下:

let r = interestingNumbers["Prime"]!

r 将自动成为[Int] 类型。

下面的表达式同理:

let r = interestingNumbers["Prime"]

r 的类型为 [Int]?

注意:在 Swift 中,最好写成 [Int] 而不是 Array&lt;Int&gt;

【讨论】:

  • 谢谢。那是我不明白的地方。如果我写 letinterestingNumbers:[String: Array] .. 并不意味着我说它不能返回 nil 数组,而是返回一个 Array?
  • 现在我明白了,如果密钥不存在,它将返回 nil。谢谢
  • 另一种方式:let r = interestingNumbers[“Prime”, default: [])
  • 让 Swift 解释 r 的类型。此外,写Array&lt;Int&gt; 的首选方式是[Int]
  • 我会留下?? 的例子,因为它也是有效的。由于 OP 是 Swift 的新手,也鼓励他们让 Swift 推断 r 的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2021-08-31
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多