2016-03-25 6 views
2

は、次のことを想定しますイニシャライザの機能を使用する - スウィフト?

class A { 
    let x : Int 
    init() { 
     self.x = assign(1) 
    } 
    func assign(y : Int) -> Int { 
     return y 
    } 
} 

これはエラーを生成します。

ここに私の質問です:クラス初期化子内の関数を呼び出す方法はありますか?

EDIT:追加されましたエラーメッセージ:メソッド呼び出しの「自己」の

使用「割り当て」保存されているすべてのプロパティが

+0

例外/エラーは何ですか?あなたが得ている実際の結果を見るのに役立つでしょう – konkked

+0

複数のソリューションがありますが、実際のユースケースが役立ちます。 – Sulthan

答えて

1

を初期化される前に、私はそれが最大の解決策ではないと思いますが、それでも、それは働いている。

class A { 
     var variable : Int 

     init() { 

      self.variable = A.assign(1) 

     } 

     private class func assign(y : Int) -> Int { 
      return y 
     } 
    } 
+0

ありがとう、ありがとう。好奇心のせいで、なぜ以前の方法ではうまくいかなかったのですか? –

+0

それはクラス関数であり、この種の関数はオブジェクトの初期化を必要としません@Sulthanは深く説明できます –

0

あなたが好き代を使用できます。

class A { 
    var x : Int! 
    init() { 
     x = assign(1) 
    } 
    func assign(y : Int) -> Int { 
     return y 
    } 
} 

この方法の欠点は、あなたがxにアクセスし、それが初期化されていない場合は、ランタイムエラーを取得することです。答えはthisです。

+0

xを許可するもの! xはしないうちに働く? –

+0

これは 'x'がオプションなのでエラーがなくなりました。今度は、あなたがそのようなプロパティを持たないので、すべてのストアドプロパティが初期化される前に 'self'を使用しません。 – Jelly

1

インスタンスが初期化されるまで(initが行われる前に)あなたは、インスタンスメソッドを呼び出すことはできませんが、classstaticキーワードを使用して定義されたモジュールレベルの機能とtype methodsを使用することができます。

func compute(y: Int) -> Int { 
    return y 
} 

class A { 
    let x: Int 

    static func assign(y: Int) -> Int { 
    return y 
    } 

    init() { 
    x = A.assign(3) + compute(4) 
    } 
} 
関連する問題