在Swift 2中使用带有可选参数的“init”模糊不清

时间:2016-01-19 14:23:12

标签: xcode swift swift2

我刚刚将我的代码从Swift 1.2更新为Swift 2.1。该项目与之前版本的Swift完全兼容,但现在我看到“模糊地使用'init'”错误。每次出现此错误似乎都是由构造函数中使用可选参数引起的。我甚至设法使用相同的模式使用以下简化代码在Xcode Playground中重现此问题:

class Item : UIView {
    override init(frame: CGRect = CGRectZero) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

let i = Item()             # Ambiguous use of 'init(frame:)'

但是,我仍然不明白为什么Swift 2.1现在有这个模式的问题,或替代应该是什么。我已经尝试过搜索这个,但我偶然发现的是由于方法重命名或签名更改导致的其他(非构造函数)方法的“模糊使用”错误,这两种情况都不是这样。

1 个答案:

答案 0 :(得分:4)

这是不明确的用法,因为当你调用let i = Item()时,有2个选项 - init(frame:CGRect = CGRectZero)和init()

最好这样做:

override init(frame: CGRect) {
    super.init(frame: frame)
}

convenience init() {
    self.init(frame: CGRectZero)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}