2017-05-15 15 views
0

私はここで多くの質問を検索しましたが、誰も以下の質問のためではないようです。 あるクラスから別のクラスに値を返すブロックを書く方法は?


私はSwiftでブロック補完を作成しようとしています。

これは、クラスXのオプションの変数閉鎖

var onLogCompletion:((_ logThing:String) ->())? 

これは、クラスXからクラスXの機能

func printerCompletion(currentLog:String) -> Void { 
    //This is giving me an error: 
    //Cannot call value of non-function type '((String) ->())?' 
    !(onLogCompletion(currentLog)) 
} 

であり、私は呼びたいですこのような機能。ビューコントローラで

printerCompletion("New Log") 

、私はこのようなものをやってみたいです。

let objX = X() 
objX.onLogCompletionm { (log) in 
    print(log) 
} 

That should print New Log in a View Controller file.

私はOBJの-Cではなくスウィフトでこれをやった経験を持っています。

これを解決するには、またこれを行うよりよい方法がある場合は、こちらをご覧ください。

+0

はnilになります賢明な他のブロックから呼び出す前に、ブロックを定義する必要が

var onLogCompletion:((_ logThing:String) ->())? = nil func printerCompletion(currentLog:String) -> Void { self.onLogCompletion!(currentLog) } self.onLogCompletion = { (log) in print(log) } 

はあなたが表示されことができますこの 'printerCompletion'を呼び出すのは' init'から呼び出すと 'onLogCompletionm'がセットされておらず、補完を呼び出すときに強制的に折り返してしまうからですあなたは無限になっています。コードをもっと表示してください。 –

答えて

1

このかもしれないこのヘルプお試しください:あなたがどこにいるあなたはそれが

objX.onLogCompletionm = { (log) in 
          print(log) 
        } 

    printerCompletion(currentLog: "New Log") 

enter image description here

+0

クイックアンサーに感謝します。「致命的なエラー:オプション値をアンラッピングしている間に予期せぬエラーが発生しました。スウィフトでこれを行うためのより良い方法がありますか? – Hemang

+0

閉鎖のために 'nil'をセットするとすぐに動作します。 onLogCompletion!= nil { onLogCompletion!(currentLog) }}エラーコードを修正するには、 'func printerCompletion(currentLog:String) - >無効をチェックする必要があります。 – Hemang

+0

はい、クラッシュしないようにチェックする必要があります。 – KKRocks

関連する問題