- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
将项目迁移到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)
]
像这样设置上面的元素时,会导致上述错误
最佳答案
一些观察:
实际上不是迁移本身导致了问题。问题很简单,您现在正在编译它的 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
,而是要求我们明确说明我们的意图。
为了比较,请考虑以下两种情况,其中没有歧义,因此没有警告。例如,考虑相同的隐式解包可选,这里它知道隐式解包应该发生:
let foo: UIButton = button
而这里它知道 foo
将是可选的:
let foo: UIButton? = button
如果您想知道为什么您的隐式解包 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/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!