我是 swift 的新手,我正在为新的 swift 结果而苦苦挣扎。 所以我有这个功能:
enum LoginOption {
case signInWithApple
case emailAndPassword(email: String, password: String, completion: Result<Data, Error>)
}
// func 1: wrapped with a ui tapped button event:
private func emailAuthenticationTapped() {
login(with: .emailAndPassword(email: email, password: password, completion: {res in
// to do
}))
// func 2: generic function that routes to the right signIn function based on signIn type:
func login(with loginOption: LoginOption) {
switch loginOption {
case let .emailAndPassword(email, password, completion):
handleSignInWith(email: email, password: password, completion: (Result<Data, Error>) -> Void)
// func 3: main async func to handle signin
private func signIn(email: String, password: String, completion: @escaping (Result<Data, Error>) -> Void) {
...
}
我收到此错误:
无法将 '((Result) -> Void).Type' 类型的值转换为预期的参数类型 '(Result) -> Void'
答案 0 :(得分:1)
你需要这样称呼它
signInWith(email: email, password: password) { res in
// to do
}
或
signIn(email: email, password: password,completion: { res in
// to do
})
答案 1 :(得分:1)
你传递的是类型,但你必须传递一个实例。
解决方案很简单:传递枚举大小写的 completion
值
func login(with loginOption: LoginOption) {
switch loginOption {
case let .emailAndPassword(email, password, completion):
handleSignInWith(email: email, password: password, completion: completion)
并替换
enum LoginOption {
case signInWithApple
case emailAndPassword(email: String, password: String, completion: Result<Data, Error>)
}
与
enum LoginOption {
case signInWithApple
case emailAndPassword(email: String, password: String, completion: (Result<Data, Error>) -> Void)
}