Swift声明LoginHandler typealias报错“Tuple element cannot have two labels”求助
解决Swift中Typealias闭包的“Tuple element cannot have two labels”错误
嘿,我来帮你搞定这个问题!你遇到的这个错误,根源是在定义闭包类型别名时的语法写法不对。
错误原因
你写的typealias LoginHandler = (_ msg: String) -> Void里,_ msg: String这种写法在Swift的闭包类型定义中是不合法的。编译器会把这里的_当成一个参数标签,同时msg又被当作另一个标签,所以就抛出了“Tuple element cannot have two labels”(元组元素不能有两个标签)的错误——简单说就是编译器被你写的下划线和参数名搞混啦。
两种解决方法
方法1:保留内部参数名,去掉下划线
如果希望在调用闭包时能清晰看到参数含义,可以直接保留内部参数名,去掉多余的下划线:
typealias LoginHandler = (msg: String) -> Void
之后在你的登录函数里调用loginHandler时,还可以用参数标签来传递值,代码可读性更好:
func login(withEmail: String, password: String, loginHandler: LoginHandler?){ Auth.auth().signIn(withEmail: withEmail, password: password) { user, error in if let error = error { // 带标签传递错误信息 loginHandler?(msg: error.localizedDescription) } else { loginHandler?(msg: "登录成功!") } } }
方法2:直接指定参数类型(省略参数名)
如果不需要参数标签,只关心参数类型,也可以简化成这样:
typealias LoginHandler = (String) -> Void
调用的时候直接传字符串即可:
func login(withEmail: String, password: String, loginHandler: LoginHandler?){ Auth.auth().signIn(withEmail: withEmail, password: password) { user, error in if let error = error { loginHandler?(error.localizedDescription) } else { loginHandler?("登录成功!") } } }
额外小贴士
在Swift中,下划线_主要用于省略函数的外部参数名,但在定义闭包类型别名时,这个写法并不适用。闭包类型的参数列表要么只写类型,要么写参数名: 类型来指定内部参数名,不需要加下划线哦。
内容的提问来源于stack exchange,提问作者Asas12
相关产品推荐
相关产品推荐

