Возможно ли создать обобщенное закрытие в Свифте?

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

можно ли сделать эту общую функцию замыканием?

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

это не работает...

Ответы

Ответ 1

Нет, потому что переменные и выражения не могут быть общими. Существуют только общие функции и общие типы.


Чтобы уточнить: на некоторых языках вы можете иметь типы с универсальным квантификатором, например forall a. a -> a. Но в Swift типы не могут иметь универсальный квантификатор. Таким образом, выражения и ценности не могут быть самими родовыми. Объявления функций и объявления типов могут быть общими, но когда вы используете такую ​​общую функцию или экземпляр такого родового типа, в качестве аргумента типа выбирается некоторый тип (который может быть реальным типом или переменной типа), а затем значение, которое вы получаете, больше не является общим.

Ответ 2

Я нашел какой-то альтернативный способ, вы можете использовать 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), так что вы можете передать ему любые значения.