gpt4 book ai didi

swift - swift forEach 中奇怪的可选类型行为

转载 作者:行者123 更新时间:2023-12-03 23:44:13 26 4
gpt4 key购买 nike

这段代码工作正常。它迭代我的数组 Int!并打印其大小。

import Foundation

let x : Int! = 1

[x].forEach {i in
print(i.magnitude)
}
输出:
1
大概, i在循环体中是一个 IntInt! ,事实上,如果我在 forEach 上向 Xcode 寻求“快速帮助”它报告:
func forEach(_ body: (Int) throws -> Void) rethrows
但是,如果在我的 forEach 中执行两个语句body,相反它无法编译,提示我需要解包 i现在有可选类型 Int? .
import Foundation

let x : Int! = 1

[x].forEach {i in
print(i.magnitude)
print(i.magnitude)
}
编译错误:
Value of optional type 'Int?' must be unwrapped to refer to member 'magnitude' of wrapped base type 'Int'
如果我现在要求“快速帮助”,我会得到:
func forEach(_ body: (Int?) throws -> Void) rethrows
我在循环体中放置的语句数量到底是如何影响循环变量的类型的?

最佳答案

基本上,您已经引出了边缘情况的边缘情况。你结合了两件魔鬼的工作:

  • 隐式解包 Optionals
  • 闭包的隐式类型推断,以及
  • 当闭包由一行组成时,闭包的隐式类型推断的工作方式有所不同(这就是“语句数量究竟如何”的用武之地)


  • 你应该尽量避免这两种情况;你的代码会更干净,编译速度也会更快。事实上,对单个文字以外的任何事物的隐式类型推断,如字符串、Int 或 Double,都会极大地拖累编译时间。
    我不会假装模仿编译器的推理;我将向您展示一个实际的解决方案(除了首先不使用 IUO):
        [x].forEach {(i:Int) in
    print(i.magnitude)
    print(i.magnitude)
    }
    我们的 Int type 是合法的,因为我们利用了单一的“摆脱 jail ”卡说隐式解包的 Optional 可以直接在需要解包类型本身的地方使用。并且通过显式说明类型,我们消除了编译器的疑虑。
    (我说“直接”是因为 Optional 的隐式展开没有通过传递和赋值传播。这就是为什么在你的第二个例子中你发现 Int? 而不是 Int 被传递到闭包中。)

    关于swift - swift forEach 中奇怪的可选类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63861740/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com