できるだけシンプルに作成し、問題の集計をします。 exempleのために、私は自動生成の束クラスメソッドを持つクラスを持っているジェネリックパラメータを使用して関数に「オプションのアンラッピング」を実行する方法
func doSomething<T>(using f: (String, (T) -> Void) -> Void, key: String) {
f("test", {
object in
// do something with object using key
//...
})
}
を::
のは、私は次のように定義された機能を持っているとしましょう
class MyClass {
var prop1: String = ""
}
class MyClassAPI {
class func f1(param: String, completion: (MyClass) -> Void) {
let mc = MyClass()
mc.prop1 = "hello"
completion(mc)
}
}
を次に、I
// Any because of cast problem !
let keyFunctions: [String: Any] = [
"first" : MyClassAPI.f1,
"second" : MySecondClassAPI.f2,
"third" : MyThirdClassAPI.f3
//...
]
最後に、すべてのキー/ fを繰り返します
for (k, f) in keyFunctions {
// This line doesn't work as the compiler complain about typing errors
doSomething(using: f, key: k)
}
私が直面してる問題は、私はdoSomething
にそれらを渡すために右のタイプに私の機能をキャストすることができないということです:f as! (String, (_) ->()) -> Void
を使用してキャストを強制すると仮定
Xcodeは、次に示しますdoSomething
を呼び出すための慰め私はエラー、_はタイプではありません。
if let uf = f as? (String, (Any) -> Void) -> Void
を使用すると、より寛大になりました。
これを達成するためのヒントなしにSwiftマニュアルの全般的なページを読みました。
一般性を使用してそのようなことを実行する既存の方法を教えてください。
これらは高いkindedタイプと呼ばれています。スイフトはそれらをサポートしていません。 – Alexander
辞書の 'f1'、' f2'、 'f3'関数は別のクラスを返しますか?彼らは少なくとも同じプロトコルに準拠することができますか? – Dmitry
@ Dimitryいいえ、それらは異なるクラスから返されません。実際、そのパラメータの1つはクロージャであり、それぞれが異なる型をパラメータとして取ります。 私はそれらをプロトコルに準拠させる必要があると思います。 – dulgan