2017-11-07 14 views
3

のオプションパラメータとしてクロージャを渡し、最後のパラメータは、コールバッククロージャである:私は2つのパラメータを取る関数を持っている機能

func myAsycTask(name: String, callback: @escaping()->Void) { 
    myQueue.async{ 
     self.doTask(name) 
     callback() 
    } 
} 

func doTask(name: String) {...} 

私は、オプションの第二のコールバッククロージャパラメータを作成したいと思います。

Nil default argument value of cannot be converted to type ' () -> '

どのように私はその後、必要なものを達成することができます:

func myAsycTask(name: String, callback: @escaping()->Void? = nil) { 
     myQueue.async{ 
      self.doTask(name) 
      callback() 
     } 
} 

は、私は、コンパイラのエラーを取得する:私はするために、上記の関数を再定義しようとしましたか?

+1

まあhttps://stackoverflow.com/questions/39618803/swift-3-optional([答え] -escaping-closure-parameter) – Jack

答えて

4

現在のコードは、Voidがクロージャーのオプションの戻り値であることを意味します(これはあまり意味がありません。Voidはまだ何もありません)。 は、パラメータを角かっこで囲み、オプションにしてください。

func myAsycTask(name: String, callback: (() -> Void)? = nil) 
+0

しかし、クロージャはクロージャではなく、オプションのクロージャであるため、「@エスケープ」することはできません。 –

+1

@AuRisいいえ、あまりありません。 [this](https://stackoverflow.com/a/39846519/3151675)を参照してください。 – the4kman

+0

ああよく目撃された!ありがとう!私は自分自身を知りませんでしたので、知っておいてよかったです。 –

0

オプションコールバッククロージャを作ってみましょうとを@escaping を削除します。

import UIKit 

// Also you can use a type alias to keep code more readable 
typealias Callback = (() -> Void?) 

class Test { 

    let myQueue = DispatchQueue(label: "com.playground") 

    func doTask(name: String) { 
     // something... 
    } 

    func myAsycTask(name: String, callback: Callback? = nil) { 
     myQueue.async { [weak self] in 
      self?.doTask(name: name) 
      callback?() 
     } 
    } 
} 
関連する問題