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