2017-07-15 1 views
2

私は即時の辞書myDを持っています。タイプはmyEnum、キーは()です。 キーの機能を試してみると、すべての関数が呼び出されます。助けてください。スウィフト辞書を使用すると、そのすべての値が返されますか?

class myScene: SKScene { 
    enum myEnum { 
     case one 
     case two 
    } 

    func foo1() { print(1) } 
    func foo2() { print(2) } 

    var myD: [myEnum :()] { 
     return [ 
      .one : foo1(), 
      .two : foo2() 
     ] 
    } 

    func runFuncForCase(_ ca: myEnum) { 
      myD[ca] 
    } 

    override func didMove(to view: SKView) { 
     runFuncForCase(.one) //HERE!!!!! 
    } 

}

私はrunFuncForCase(_:)機能に.oneまたは.twoを入れ天気を、アプリを実行し、consleは常に「1」と「2」、印刷し両方の機能を意味している。ここでは以下のコードです走った。

+1

'runFuncForCase [.one]'はコンパイルされません。 'runFuncForCase(.one)' – vadian

答えて

7

ディクショナリのこの宣言では、ディクショナリの値の型はVoidで、空のタプル()のみを含むことができます。

var myD: [myEnum :()] { 
    return [ 
     .one : foo1(), 
     .two : foo2() 
    ] 
} 

そしてfoo1()foo2()myDのゲッターが呼ばれたときに評価されています。 myDの添字の後にはありません。 (そして、彼らの戻り値の型はVoidているので、彼らは空のタプルを返すように考えられている。)

あなたはこのような何か書く必要がある場合があります。注意すべきで

class myScene: SKScene { 
    enum myEnum { 
     case one 
     case two 
    } 

    func foo1() { print(1) } 
    func foo2() { print(2) } 

    var myD: [myEnum :()->Void] { //### value type of the dictionary needs to be a function type 
     return [ 
      .one : foo1, //### actual value of the dictionary needs to be a function itself, 
      .two : foo2, // not the result of calling the function 
     ] 
    } 

    func runFuncForCase(_ ca: myEnum) { 
     myD[ca]!() //### To invoke the function, you need `()` 
    } 

    override func didMove(to view: SKView) { 
     runFuncForCase(.one) 
    } 
} 

、いくつかの注意事項を

上記のコードは、インスタンスメソッドが暗黙のうちに強い参照をselfとして保持するので、保持サイクルを作成するリスクを無視して、少し簡略化されています。

あなたがすべき実際のアプリケーションで

、このような

  • foo1作成しfoo2トップレベルの関数

または

  • 書き込み何か:

    var myD: [myEnum :()->Void] { 
        return [ 
         .one : {[weak self] in self?.foo1()}, 
         .two : {[weak self] in self?.foo2()}, 
        ] 
    } 
    
+0

ありがとうございます。それは完璧に働いた。私が '{[weak self] in ....()}'を追加するまで。それは私にエラーを与え始めた。 – Fayyouz

+1

@Fayyouz、申し訳ありませんが、その部分を追加するのは時期尚早でした。 (私のXcodeは遅すぎてエラーを表示することはできません...)エスケープするクロージャ内でインスタンスメソッドを呼び出すには、 'self'の前に接頭辞を付ける必要があります。編集したコードを試してみて、他のエラーが発生した場合は教えてください。 – OOPer

+0

これは編集で動作します、ありがとう! – Fayyouz

関連する問題