2017-09-18 13 views
3

Swift 4に移行しようとすると、Voidを入力として使用すると、ジェネリックタイプのクロージャでエラーが発生しました。これはSwift 3ではうまくいきましたが、それほど多くはありませんでした。だれかがなぜこれを知っていますか?これはバグか機能ですか?一般的なタイプイライア(Void)でSwift 4の引数が欠落しています

このケースを明示的に処理する別のクロージャを無視することで回避策があります。このエラーはスウィフト4に

typealias Handler<T> = (T) -> Void 

func foo(completion: Handler<String>) { 
    completion("fooing") 
} 

// This worked in Swift 3, but not in Swift 4 
func bar(completion: Handler<Void>) { 
    completion() // Missing argument for parameter #1 in call 
} 
+1

はhttps://stackoverflow.com/questions/45837915/generic-swift-4-enum-with-void-associated-typeと同様の問題である可能性があり、あなたは '呼び出す必要が完了(()) ' –

答えて

6

を生じたしかし、なぜこの回避策を使用し、理解する必要がないためにいいだろうバグではないようですが、スウィフトは、今どのように動作しますか。関連する値Voidの値を省略することはできません。

最初のものだけで明示的に値だけを渡します。

私は2つのまずまずの回避策を発見しました。

func bar(completion: Handler<Void>) { 
    completion(()) 
} 

第2の解決策は、無効な場合の別のタイプアリアスを宣言することです。

typealias VoidHandler =() -> Void 

func barbar(completion: VoidHandler) { 
    completion() 
} 
関連する問題