【问题标题】:Closure that takes a generic type?采用泛型类型的闭包?
【发布时间】:2020-01-19 20:37:54
【问题描述】:

使用以下完成处理程序代码,为什么它会给我一个关于 completionClosure 类型的错误?

enum ModelSerializerError: Error {
    case readjson(String)
    case writejson(String)
    case writeFirebase(String)
    case readFirebase(String)
}

enum ModelSerializerResult<T> {
    case success(T)
    case failure(ModelSerializerError)
}

static func serializeToFirebase<T>(value: T.Type, path: String, completion: @escaping (ModelSerializerResult<Void>) -> Void) where T: Encodable { ... }

// Later in some function...

let handleError : (Error) -> () =
    { error in
        print("Error: \(error)")
    }

let completionClosure : (ModelSerializerResult) -> () =
    { result in // Cannot convert value of type '(_) -> ()' to specified type '(ModelSerializerResult) -> ()'
        switch result {
        case .success(let val): ()
        case .failure(let error): handleError(error)
        }
    }

serializeToFirebase(value: MyClass.self, path: path, completion: completionClosure)

【问题讨论】:

    标签: swift closures


    【解决方案1】:

    如果您不熟悉闭包语法,这可能有点棘手。在这个例子中,我错过了泛型。换行:

    let completionClosure : (ModelSerializerResult) -> () =
    

    let completionClosure : (ModelSerializerResult<Void>) -> () =
    

    【讨论】:

    • 这与闭包语法无关,它是关于了解泛型类型并知道没有这样的类型ModelSerializerResult,当您想将它用作变量类型。如果您想键入注释一个简单的泛型变量而不使其成为闭包,则会遇到相同的错误。
    • 当然,但这是遇到此错误的常见用例。一个不知道他们正在搞乱通用方面的开发人员会沿着这些思路搜索一些东西。无法搜索您不知道的内容。
    猜你喜欢
    • 2019-11-04
    • 2023-03-26
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多