前言
最近有机会接触IOS开发,学习了下协议实现回调的方法,实操感觉不够简洁但能实现功能,基本沿用java接口的思路。后续如果学习到更好的方法也会更新文章,希望下文能对你有所启发/帮助,如果有错误也还请麻烦纠正下,感谢。
正文
先声明一个协议,此处就拿登录回调来举例,协议内定义三个方法,有无回调参数都行,代码示例:
public protocol LoginListener {
func loginSuccess(token: String)
func loginFailed(err: String)
func loginCancel()
}
然后将上述声明的协议作为一个参数在方法中调用,例如登录成功时,代码示例:
public func appleLogin(view: UIViewController, loginListener: LoginListener) {
loginApple(view: view, { token in
loginListener.loginSuccess(token: token)
} ,{ err in
loginListener.loginFailed(err: err)
})
}
最后定义一个struct,将struct作为参数传入,就能够收到回调啦,代码示例:
struct loginCallback: LoginListener {
func loginSuccess(token: String) {
NSLog("login success==", token)
}
func loginCancel() {
NSLog("login cancel==", "cancel")
}
func loginFailed(err: String) {
NSLog("login failed==", err)
}
}
@objc func allLogin() {
Login(view: self, loginListener: loginCallback() as LoginListener)
}
最后补充一点,我是想在登录成功的回调内实现从当前view跳转到另一个View,上述方法就会报错,提示类型不对,可以尝试下面的方法,代码示例:
class ViewController: UIViewController {
...
@objc func allLogin() {
Login(view: self, loginListener: self)
}
}
extension ViewController: LoginListener {
func loginSuccess(token: String) {
NSLog("login success==", token)
}
func loginCancel() {
NSLog("login cancel==", "cancel")
}
func loginFailed(err: String) {
NSLog("login failed==", err)
}
}
不能说和java的回调一模一样,只能说是毫无区别,后面如果有更优美的方法我会再回来更新的哈。