web-dev-qa-db-ja.com

初期化子は、そのスーパークラスから指定された初期化子をオーバーライドしません

だから私はXcode 6.3 Beta 3にアップグレードしたばかりで、次のことに関連する多くのエラーが表示されています:

初期化子は、スーパークラスから指定された初期化子をオーバーライドしません。

override init() {
    super.init()
}

たとえば、これはUIButtonクラスです。

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!

    override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIButton'
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
}

これは私のUIViewControllerクラスの1つです。

class CustomAlertView: UIViewController {

    required init(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    required override init() { // Initializer does not override a designated initializer from its superclass
        super.init() // Must call a designated initializer of the superclass 'UIViewController'
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
}
37
fuzz

私の解決策は簡単な修正ですが、リリースノートのAppleの目的よりも簡単です。詳細については19775924を検索してください http://adcdownload.Apple.com //Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf here。Appleは、Objective-Cファイルを作成して拡張すること(ヘッダーに追加すること)ファイルとすべて)と「Xcode 6.3ベータ3の既知の問題」にあるので、私がやったことは簡単だと思います:

これはUIButtonの修正方法です:

_class CustomButton : UIButton {
    init() {
        super.init(frame: CGRectZero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
_

そして、これは私のViewControllersの1つです(不要な場合はパブリックを削除してください):

_public class GenericViewController: UIViewController {
    public init() {
        super.init(nibName: nil, bundle: nil)
    }

    required public init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
_

私はIBを使用しないので、UIViewも持っています。これは、ビューをviewControllerから分離しているためです(不要な場合はパブリックを削除します)。

_public class GenericMenuView: UIView {
    public init() {
        super.init(frame: CGRectZero)
    }

    public required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
_

Initで呼び出されるすべてのサブクラスでオーバーライドするsetupViewsメソッドがあるため、特にビューでこれが必要です。 AutoLayoutを使用すると、フレームは必要ありません(したがって、frameパラメーターでinitをオーバーライドしません)。

したがって、overrideを削除する必要があるようです。ああ! self.init()を呼び出さないようにしてください。そうしないと、クラスが初期化されることはありません(内部タイムアウト後にクラッシュします)。

43
Lluis Gerard

Apple documentation here に従って、オーバーライドするのは便利な初期化子です。初期化子が機能するには、メソッドを次のように変更する必要があります。

override convenience init() {
    super.init()
}

それを行うか、スーパークラス初期化子を呼び出す以外に実際に使用していない場合は、初期化子を削除します。

4
lostInTransit

これは見かけよりもずっと簡単だと思います。

SKSpriteNodeの場合、これを実行していました。

override init() {
    let texture = SKTexture(imageNamed: "bgTile")
    super.init(texture: texture, color: nil, size: texture.size())
}

問題はinit()がSKSpriteNodeの指定された初期化子ではないことです。だから私はそれを次のように変更しました:

override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    let texture = SKTexture(imageNamed: "bgTile")
    super.init(texture: texture, color: nil, size: texture.size())
}

今では正常に動作します。

3
user3590685

エラーの解決策:オーバーライドinit(coder aDecoder:NSCoder!)が期待どおりに機能しない-Swift

これは私のために機能します、これを試してください、注:uは目覚めなければなりません

override func awakeFromNib() {

     super.awakeFromNib()
    // Initialisation code

}
1
Sanju

私は最近これを理解し、問題が何であったかを説明したいと思います。 Apple Developer forums で最初に回答しました。

Swift=は初期化子の依存関係チェックまたは初期化子の重要性の戦略を変更したようです。

ここで、初期化子が示されている場合、Xcode 6.3 Beta 2とBeta 3の両方に対処する1つの方法は、すべての初期化子定義を削除することです。

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!    
}

class CustomAlertView: UIViewController {

}

指定された初期化子を定義せずに、クラスはスーパークラスのすべての初期化子を継承します。

かなり簡単な修正ですが、しばらく困惑していた大きな落とし穴。

1
fuzz