如何将闭包提取为typealias?typealias代码重构疑问
正确提取闭包为typealias的方法
你遇到的问题是因为你定义的vpnLoadHandler不再是符合loadFromPreferences要求的闭包类型——你把它改成了一个接受闭包作为参数的函数,而不是让它本身就是那个闭包类型。咱们一步步来修正:
1. 先定义正确的typealias
首先,NEVPNManager.loadFromPreferences的completionHandler参数类型是(Error?) -> Void,所以我们的typealias要完全匹配这个类型:
// Swift类型名建议首字母大写,更符合规范 typealias VPNCompletionHandler = (Error?) -> Void
2. 用typealias声明你的处理函数
现在你可以直接用这个typealias来定义你的处理函数,让它的类型完全符合要求:
// 方式1:函数形式,参数类型匹配typealias func vpnLoadHandler(_ error: Error?) -> Void { // 在这里写你的错误处理逻辑 if let error = error { print("VPN加载失败:\(error.localizedDescription)") } else { print("VPN配置加载成功") } } // 方式2:直接创建一个符合typealias的闭包常量(更简洁) let vpnLoadHandler: VPNCompletionHandler = { error in if let error = error { print("VPN加载失败:\(error.localizedDescription)") } else { print("VPN配置加载成功") } }
3. 正常调用即可
这时候调用loadFromPreferences就和原来一样,类型完全匹配,不会报错:
NEVPNManager.shared().loadFromPreferences(completionHandler: vpnLoadHandler)
为什么你的原尝试会出错?
你之前写的:
func vpnLoadHandler(complete: @escaping vpnCompleteClosure) { }
这个函数的类型是(VPNCompletionHandler) -> Void,和loadFromPreferences需要的(Error?) -> Void完全不匹配,所以编译器会报错。你要做的是让vpnLoadHandler本身就是VPNCompletionHandler类型,而不是一个接受这个类型参数的函数。
内容的提问来源于stack exchange,提问作者Houman
相关产品推荐
相关产品推荐

