2017-03-14 8 views
0

私は、View Controller Bをポップオーバーとして表示するView Controller Aを持っています。私がしようとしているのは、ビューコントローラAに設定されているビューコントローラBに設定されている値を取得することです。他のView Controllerでパラメータを設定してクロージャを設定する

私が考えているのは、パラメータを受け取り、 Bはそれをパラメータと呼んでいます。

ので、VC Aで、私が持っている:

func update(val:String) { 
} 

その後、私はVC Bを作成するときに、私が試した:

bVC.notifier = update 

をしかし、私はエラーを取得しています:

Cannot assign value of type '(String, String) ->()' to type '() -> {}' 

次に、ビューコントローラB:

public var notifier = {} 

私はそれをどのように呼び出すのかは分かりません。

私は以下を読んでいます:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94しかし、この状況を非常にうまくカバーしていないと思います。

+0

*備考:※[この答え]をチェックし、このような機能を実現するための他のメカニズムをチェックすることもできます(https://stackoverflow.com/questions/40501780/examples-of-delegates-in-swift -3/40503024#40503024)(代替品) –

答えて

1

このようにしたい場合は、ここでは一緒に遊び場に置く例があります。ビューコントローラではなく単純なオブジェクトを使用しますが、必要な構文が表示されるはずです。

class A { 
    func doSomething() { 
     let myB = B() 
     myB.notifier = { (s1, s2) in 
      print("\(s1) : \(s2)") 
     } 
     myB.give() 
    } 
} 

class B { 
    typealias ReturnRoutine = (String, String) ->() 
    var notifier: ReturnRoutine? 

    func give() { 
     if let notifier = notifier { 
      notifier("First", "Second") 
     } 
    } 
} 

let myA = A() 
myA.doSomething() 
+0

これを使用していただきありがとうございます。ただし、既存の関数をクロージャーとして使用することは指定していません。 – Thom

+1

私は、あなたの関数が互換性のある署名、func f(one:String、two:String) 'を持っている限り、直接の置換だと思います。 –

関連する問題