web-dev-qa-db-ja.com

Xcode 6.3 Beta3で初期化子をオーバーライドしようとするとビルドエラーが発生する

次のコードは、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メソッドを使用してプロトコルを作成することで回避策が考えられます。 initinit(frame: CGRect)の両方の初期化子を機能させることができませんでした。

これらのビルドエラーを修正するにはどうすればよいですか?

17
Evgenii

サブクラスの指定された初期化子は、スーパークラスの指定された初期化子を呼び出す必要があります。コンビニエンス初期化子は、別のコンビニエンス初期化子またはそのクラスの指定された初期化子のみを呼び出すことができます。

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便利な初期化子は、最終的に指定された初期化子を呼び出す必要があります。

17
ManicMonkOnMac

Swift3が機能しています:@ Andreaコメント

super.init()self.init()を変更してみてください

1
Nazmul Hasan

解決する追加の方法は、UIViewのフレームパラメーターにデフォルトの引数を提供することです。

override init(frame: CGRect = CGRectZero) {
     super.init(frame: frame)
     // custom code
}
0
wfbarksdale