web-dev-qa-db-ja.com

Swiftで一般的なクロージャーを作成することは可能ですか?

func myfunc<T>(i:T) -> T {
    return i
}

この汎用関数をクロージャにすることは可能ですか?

let myfunc = { <T>(i:T) -> T in
    return i
}

これは機能しません...

26
Ken Zhang

いいえ、変数と式は一般的ではないためです。ジェネリック関数とジェネリックタイプのみがあります。


明確にするために:一部の言語では、forall a. a -> aのような汎用的な数量詞付きの型を使用できます。しかし、Swiftでは、型にユニバーサル数量詞を含めることはできません。したがって、式と値はそれ自体がジェネリックになることはできません。関数宣言と型宣言はジェネリックにすることができますが、そのようなジェネリック関数またはそのようなジェネリック型のインスタンスを使用する場合、いくつかの型(実数型または型変数である可能性があります)が型引数として選択され、その後、取得する値自体はもはや一般的ではありません。

14
newacct

私はいくつかの代替方法を見つけました。クロージャーでAnyobjectを使用して、任意の値をメソッドに渡すことができます。

typealias genericCompletion<T:AnyObject> = ((Bool,T,String) -> Void)
struct Student {
    var name:String = "Kishore"
    var age : String = "125"
}
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.createAGenericReturn { (success, object, message) in

        }

        self.createStructGeneric { (success, student, message) in

        }

    }


    func createAGenericReturn(callback:@escaping(genericCompletion<AnyObject>)){
        callback(true,434.433 as AnyObject,"kishoreTest")
    }

    func createStructGeneric(callback:@escaping(genericCompletion<AnyObject>)){
        callback(true,Student.init() as AnyObject,"kishoreTest")
    }

}

ここで、GenericをAnyobjectとして言及したことがわかりますtypealias genericCompletion =((Bool、T、String)-> Void)なので、任意の値を渡すことができます。

0
Kishore Kumar