func myfunc<T>(i:T) -> T {
return i
}
这个通用函数可以成为闭包吗?
let myfunc = { <T>(i:T) -> T in
return i
}
这个不起作用...
forall a. a -> a
。但在 Swift 中,类型不能有全称量词。所以表达式和值本身不能是通用的。函数声明和类型声明可以是通用的,但当你使用这样的通用函数或者通用类型的实例时,某种类型(它可以是一个真实类型或者一个类型变量)会被选择作为类型参数,之后你得到的值不再是通用的了。typealias
。 - MazyodStringLiteralConvertible
。我认为你的困惑在于将变量或表达式视为通用;相反,它是通用的闭包。 - Slipp D. Thompsonfunc loginUser(userName: String, password: String, resultHandler: ResultClosure?)
它是泛型的,并且具有编译时类型检查。 - Konstantin Khamenoktypealias ResultClosure<T> = (ResultCode, String?, T?) -> Void
函数声明:
func loginUser(userName: String, password: String, resultHandler: ResultClosure<TokenModel>?)
使用方法:
NetConnector.shared.loginUser(userName: userName ?? "", password: password ?? "") { (code, message, data) in
self.display?.unlockScreen()
if code == .success {
if let activeToken = data {
AppData.shared.userToken = activeToken
}
self.display?.showHome()
} else {
self.display?.showError(errorMessage: message)
}
}
如前所述,Swift 中的变量不能是通用的,因此创建一个闭包,其通用类型由调用者指定是不可能的。但是,有一些解决方法:
通过 SE-253,可以使任意(名义)类型可调用。因此,我们可以声明一个(非通用的)结构体,该结构体具有通用的callAsFunction
方法,而不是声明一个通用的闭包:
struct MyFunc {
func callAsFunction<T>(_ i: T) -> T {
return i
}
}
let myFunc = MyFunc()
let x = myFunc(42) // -> Int
let y = myFunc("foo") // -> String
我已经找到了一些替代方案,你可以在闭包中使用 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")
}
}
在这里你可以看到我将“泛型”称为 Anyobject typealias genericCompletion = ((Bool,T,String) -> Void),所以你可以向其中传递任何值。
myfunc
将是一个抽象类型,这与尝试构造抽象类相同。我在@MartinR链接的问题的答案中讨论更多。 - Rob Napier