我有一个在Xcode 6.0上完美运行的自定义UITableViewCel(没什么特别之处)。 当我尝试使用Xcode 6.1编译它时,编译器显示以下错误:
A non-failable initializer cannot chain to failable initializer 'init(style:reuseIdentifier:)' written with 'init?'
以下是单元格的代码:
class MainTableViewCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
func setup() {<...>}
}
作为解决方案,编译器建议Propagate the failure with 'init?'
:
override init?(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
我有点困惑。
有可能详细说明什么是(non)failable initialiser
以及如何使用和覆盖它?
答案 0 :(得分:26)
使用Swift 1.1(在Xcode 6.1中),Apple引入了可用的初始化程序 - 也就是说,初始化程序可以返回nil
而不是实例。您可以在?
之后添加init
来定义可用的初始值设定项。您尝试覆盖的初始化程序在Xcode 6.0和6.1之间更改了其签名:
// Xcode 6.0
init(style: UITableViewCellStyle, reuseIdentifier: String?)
// Xcode 6.1
init?(style: UITableViewCellStyle, reuseIdentifier: String?)
因此,为了覆盖您,我需要对初始化程序进行相同的更改,并确保在创建单元格时处理nil
大小写(通过指定可选项)。
您可以阅读有关failable initializers in Apple's documentation的更多信息。