super.init() 无法在 swift3 中调用

Posted

技术标签:

【中文标题】super.init() 无法在 swift3 中调用【英文标题】:super.init() couldn't be called in swift3 【发布时间】:2016-11-07 05:23:22 【问题描述】:

super.init()被调用时,报错:

必须调用超类“UICollectionViewCell”的指定初始化程序。

当我在 swift 2.2 版中使用它时,它确实工作得很好。

但是一旦我将 Xcode 版本升级到 8.0,我一直在使用 Swift 3.0 版本并且super.init() 不适合我。

【问题讨论】:

【参考方案1】:

从 swift3 开始,他们已经删除了 UICollectionViewCell 的 init()。所以你必须使用 super.init(frame: CGRect) 而不是普通的 init()。

【讨论】:

【参考方案2】:

你可以使用 super.init(frame: CGRectZero)

【讨论】:

【参考方案3】:

你可以使用便捷初始化器代替指定初始化器

Swift 有三个关于指定初始化器和便利初始化器如何相互关联的规则。我不想解释它们,而是直接引用 Apple 的 iBook:

1) 指定初始化程序必须从其直接超类调用指定初始化程序。

2) 便利构造器必须调用同一个类的另一个构造器。

3) 便利构造器最终必须调用指定构造器。

摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

代替

init() 

    super.init()

你可以使用

convenience init() 

    self.init()

【讨论】:

【参考方案4】:

您只需要按照错误消息中的说明调用指定的初始化程序即可。 指定的初始化器是public init(style: UITableViewCellStyle, reuseIdentifier: String?):

// Designated initializer.  If the cell can be reused, you must pass in a reuse identifier.  You should use the same reuse identifier for all cells of the same form.  
@available(ios 3.0, *)
public init(style: UITableViewCellStyle, reuseIdentifier: String?)

所以你需要调用类似的东西:

self.init(style: UITableViewCellStyle.default, reuseIdentifier: "myIdentifier")

super.init(style: UITableViewCellStyle.default, reuseIdentifier: "myIdentifier")

而不是super.init()

【讨论】:

以上是关于super.init() 无法在 swift3 中调用的主要内容,如果未能解决你的问题,请参考以下文章

在从初始化程序返回之前不调用 Super.init

如何在Swift 3中修复我的自定义UITextField对象?

从初始化程序返回之前不会调用Super.init

为啥我不能在 Swift 中调用 UIViewController 上的默认 super.init()?

在 NSObject 子类的自定义 init 方法中使用 self = [super init]

Swift:init 中 super.init 和 self.attribute 的顺序