次のコードは、Xcode 6.3ベータ3でのビルドエラーを示しています。このコードは、Xcode6.2およびXcode6.3 Beta2で機能します。
_class MyView: UIView {
override init() {
super.init()
// Some init logic ...
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
_
イニシャライザは、指定されたイニシャライザをそのスーパークラスからオーバーライドしません
ベータ3リリースノート に記載されているinitメソッドを使用してプロトコルを作成することで回避策が考えられます。 init
とinit(frame: CGRect)
の両方の初期化子を機能させることができませんでした。
これらのビルドエラーを修正するにはどうすればよいですか?
サブクラスの指定された初期化子は、スーパークラスの指定された初期化子を呼び出す必要があります。コンビニエンス初期化子は、別のコンビニエンス初期化子またはそのクラスの指定された初期化子のみを呼び出すことができます。
init()はUIViewの便利な初期化子です。UIViewをサブクラス化する場合は、指定された初期化子であるinit(frame:frame)を呼び出す必要があります。
override init() {
super.init(frame: frame)
// Some init logic ...
}
編集:どうやらベータ3では、UIViewにはinitと呼ばれる便利な初期化子がないため、オーバーライドキーワードも削除する必要があります。これは指定された初期化子なので、スーパークラスの指定された初期化子を呼び出す必要があります
init() {
super.init(frame: frame)
// Some init logic ...
}
編集:これは機能しますが、これを書くためのより良い方法は次のようになると思います:
convenience init() {
self.init(frame:CGRectZero)
}
出典: Swiftドキュメント
ルール1指定された初期化子は、その直接のスーパークラスから指定された初期化子を呼び出す必要があります。
ルール2便利な初期化子は、同じクラスから別の初期化子を呼び出す必要があります。
規則3便利な初期化子は、最終的に指定された初期化子を呼び出す必要があります。
Swift3が機能しています:@ Andreaコメント
super.init()
のself.init()
を変更してみてください
解決する追加の方法は、UIViewのフレームパラメーターにデフォルトの引数を提供することです。
override init(frame: CGRect = CGRectZero) {
super.init(frame: frame)
// custom code
}