gpt4 book ai didi

swift - 为什么在 swift 5 迁移后 IBOutlets 是可选的

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:39 26 4
gpt4 key购买 nike

将项目迁移到swift 5后,出现了很多错误,例如

Expression implicitly coerced from 'UIButton?' to 'Any'

我不确定是什么原因造成的。发生这种情况的一个例子(有很多)是当我设置 view.accessibilityElements 时。该数组应该包含:[Any]?...知道是什么原因造成的吗?

这是一个例子:

@IBOutlet weak var shareButton: UIButton!
@IBOutlet weak var shareTitleLabel: UILabel!

view.accessibilityElements = [shareButton, shareTitleLabel]

这是另一个例子:

@IBOutlet weak var titleLabel: UILabel!

let titleConstraints = [
NSLayoutConstraint(item: titleLabel, attribute: .leading, relatedBy: .equal, toItem: otherView, attribute: .leading, multiplier: 1, constant: horizontalTextInset),
NSLayoutConstraint(item: titleLabel, attribute: .trailing, relatedBy: .equal, toItem: otherView, attribute: .trailing, multiplier: 1, constant: -horizontalTextInset)
]

像这样设置上面的元素时,会导致上述错误

最佳答案

一些观察:

  1. 实际上不是迁移本身导致了问题。问题很简单,您现在正在编译它的 Swift 5,它现在会警告您有关模棱两可的强制转换。

    由于您没有分享产生此警告的确切代码,请考虑产生该警告的这个示例:

    class ViewController: UIViewController {

    @IBOutlet var button: UIButton!

    override func viewDidLoad() {
    super.viewDidLoad()

    let foo: Any = button
    print(type(of: foo))

    // do something with `foo`
    }
    }

    那么,看一下这段代码,foo 是可选的还是未包装的值?在 Swift 5 中,它通过警告提醒我们注意这种歧义

    warning: expression implicitly coerced from 'UIButton?' to 'Any'

    它会向您展示三种可能的自动修复来消除这种歧义,即:

    • 使用nil-合并运算符,??;
    • 强制解包,!;或
    • 只需将其与 as Any 一起使用即可明确说明 foo 将是可选的,无需展开。

    最重要的是,我们希望能够轻松地对我们的代码进行推理,而 Any 类型只会让这一点变得模棱两可。编译器不再假设您是否希望打开 button,而是要求我们明确说明我们的意图。

  2. 为了比较,请考虑以下两种情况,其中没有歧义,因此没有警告。例如,考虑相同的隐式解包可选,这里它知道隐式解包应该发生:

    let foo: UIButton = button

    而这里它知道 foo 将是可选的:

    let foo: UIButton? = button
  3. 如果您想知道为什么您的隐式解包 UIButton! socket 被视为 UIButton?(而不是 ImplicitlyUnwrappedOptional 类型或自动强制展开它,即使您使用的是 Any 类型),在 Reimplementation of Implicitly Unwrapped Optionals 中有与此相关的有趣讨论。和 SE-0054 Abolish ImplicitlyUnwrappedOptional type .

关于swift - 为什么在 swift 5 迁移后 IBOutlets 是可选的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55422914/

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