2016-12-20 5 views
2

次の使用法の違いは何ですか?違いはありますか?クラスレベルのインスタンス化とメソッドレベルインスタンス化のスウィフトの違い

class B { } 

// usage 1 
class A { 
    var b: B = B(); 
} 

// usage 2 
class A { 
    var b: B! 

    init() { 
     self.b = B() 
    } 
} 

編集: は答えのいくつかは、それが初期化子内の値を取得しますので、使用量2の値はオプションである必要はないことを指摘しています。

+1

はあなたが意図したの 'B'は、使用2ではオプションではなく、使用1になるには? –

+0

FWIW、私はSwiftだけに手を貸して答えを知らなかったが、分かりやすいと分かっている(https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ Initialization.html)を、「デフォルト」値とイニシャライザで割り当てられた値との間で置き換えます。スーパークラス/サブクラス初期化子の順番を見ると、継承階層で微妙なことが起こっていると思われます。例えば、[JavaとC#は、逆の順序で明らかに同等の初期化コードを呼び出すことができます](https://chrononaut.org/2008/02/18/java-vs-c-more-fun-with-initializers/)。 –

+0

私はしましたが、今はオプションである必要はないことがわかりました。 –

答えて

3

インスタンス化は、代入文の宣言順で行われます。しかし、クラスレベルのステートメント(格納されたプロパティ)はメソッド・レベルの文の前に行われています。

// in this example, the order will be C, D, B, A 
class MyClass { 
    init() { 
     b = B() 
     a = A() 
    } 

    var a: A 
    var b: B 
    var c: C = C() 
    var d: D = D() 
} 
-1

はい、この2つには大きな違いがあります。使用法2ではbimplicitly unwrapped optionalです。あなたが行うと:

let a = A() 

はその後a.bは両方のケースで設定されますが、用法2に、誰かがそれから行うことができます。

a.b = nil 

し、使用しようとした場合、あなたはエラーが発生しますそれ。用法2内の余分な!を想定し

+3

これは宣言サイトの初期化と 'init()'の初期化の違いではないようですが、プロパティ型宣言の違いだけです。 (私はそれがOPの部分のタイプミスであると言っているまでほとんど行っているだろう) –

+0

David:そうです。質問のタイトルとサンプルコードはそれぞれ異なる問題であるため、サンプルコードは質問の意図であると仮定し、タイトルは単に間違った説明に過ぎませんでした。私は、あなたが不思議ではないものについて10行のコードを書き込むよりも、間違って何かに間違った名前を使用する方が簡単だと考えました。 :-) – WhatsUpNSDoc

0

はあなたが意味するものものではありません、には絶対に

// usage 1 
class A { 
    var b: B = B(); 
} 

// usage 2 
class A { 
    var b: B 

    init() { 
     self.b = B() 
    } 
} 

それはまったく同じだとの間に違いはありません。

+0

Hmm。暗黙のうちにアンラップされたオプションを含めることを意味しましたが、私はそれが必要でないことを今見ています。 init()メソッドを継承した継承階層を持っていても、使用法1のように変数をインスタンス化するとどうなりますか? init()で初期化された変数は、クラスレベルのインスタンス化前または後に値を取得しますか? –

+0

すべての変数がinitの終わりまでに初期化されている限り、nilを格納しない場合は、省略可能にする必要はありません。 – KPM

関連する問題