2014-10-17 71 views
18

我有一个自定义UITableViewCel(没有什么花哨)上的Xcode 6.0完美的作品。 当我尝试和Xcode 6.1编译器来编译它显示了以下错误:Failable初始化在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,它应该如何使用和overrided?

+1

您problaby讲的Xcode 6.0和6.1的? – 2014-10-17 14:48:16

+0

是的,你说得对,那几乎是一个晚上,我有点昏昏欲睡。 :) – 2014-10-17 15:02:11

+1

另外,据我所知,你应该把super.init调用放在函数的底部。我猜如果你没有任何属性,那么这没关系。 – 2014-10-17 15:37:23

回答

26

使用Swift 1.1(在Xcode 6.1中)Apple推出了failable初始化程序 - 也就是说,可以返回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

+3

你会如何建议处理这个零案件? – 2014-10-17 15:00:29

+0

6.3怎么样? – 2015-08-27 09:52:09