2017-10-25 8 views
6

2つの異なるinitメソッドに同じsetup()関数がある場合、このようなビューが表示されることがあります。 initメソッドの違いは何ですか?また、なぜ同じsetup()が両方とも呼び出されていますか?オーバーライドinitと必要なinitの違いは? - swift

class BigButton: UIButton { 

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

    required init?(coder: NSCoder) { 
     super.init(coder: coder) 
     setup() 
    } 

    fileprivate func setup() { 
     // set up stuff 
    } 
} 
+1

[Swift Language Docs](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18)を読むにはどうすればよいですか? -XID_335)についての初期化? – holex

+0

@holexスーパー・レイジー – BlueBoy

答えて

3

override init(frame: CGRect)は、プログラムでビュー(この場合はボタン)を作成するときに使用されます。

required init?(coder: NSCoder)は、storyboard/xibからビューを作成するときに使用されます。

後者が必要なので、その本体を実装する必要があります。ただし、ボタンを手動で作成しない場合は、最初のボタンは不要で省略することができます。

ボタンを作成することを選択したにもかかわらず、カスタムビヘイビアを設定したいので、あなたoverride初期化子などinit(frame: CGRect)は、あなたがプログラムでオブジェクトを作成するための責任の主要な初期化子すなわち、指定イニシャライザに対してそれを行うと、あなたは

2

あなたには、いくつかの他の場所ビルダーどこかと、プログラム両方インタフェースで、このようなクラスを使用している、とセットアップのものは関係なく、あなたがクラスを使用する方法を行わないこととしたら、それは簡単ですこのようにinit()を書きます。

init(NSCoder:)は、.nibまたはstoryboardにボタンを配置すると自動的に呼び出されます。コンパイラは、ビューのフレームを正確に認識し、init(CGRect:)は不要です。逆に、コードでビューを作成するときは、通常、init(CGRect:)を使用しますが、setup()が両方の初期化プロセス中に実行されるようにして、setup()を両方の初期化関数に入れます。

1

にそれを意図しました。ルールに従って、の前にsuper.initを呼び出して、追加のinitアクションを実行する必要があります。

必要な初期化子は、指定されたものと同じではありません。クラス 初期化子の定義は、クラスのすべてのサブクラスは その初期化子を実装しなければならないことを示すために前に必要な初期化子

は、必要な修正を書きます。

はまた 初期化子要件がチェーンでさらにサブクラスに適用されることを示すために、必要な初期化子のすべてのサブクラス 実装する前に、必要な修正を記述する必要があります。 指定されたイニシャライザ をオーバーライドするときに、オーバーライド修飾子を記述しません。

出典Apple Documentation On Initializers

あなたはサブクラスを作るとき、元のクラスが必要としてマークされている初期化子を持っている場合は、関係なく、あなたの意志の必要な初期化を実行します。通常は、オブジェクトを作成するために直接呼び出すことは想定されていませんが、場合によってはそうすることもできます。必要なイニシャライザには、複数の要件を満たすために必要なマークが付けられています。たとえば、 required init?(coder: NSCoder)が呼び出される場合があります。 1つのケース:ビューがIBから作成されたとき。もう1つのケース - オブジェクトが作成されるか、むしろ、アーカイブ解除される(つまり、逆シリアル化と呼ばれます)場合。実際、そのオブジェクトをViewControllerのビュー(たとえば)に置くと、そのオブジェクトもアーカイブされていないです。つまり、すべてのプロパティがロードされて設定されます。

明らかに、いくつかのビューのサブクラスを作成するときには、このインタフェースをサポートすることになっています。これは、デシリアライズ機能を提供します(Interface Builderまたはその両方から使用されることもあります)。これがrequiredの理由です。

関連する問題