【问题标题】:Argument type 'Error' does not conform to expected type Swift.Error参数类型“错误”不符合预期类型 Swift.Error
【发布时间】:2020-07-03 16:37:45
【问题描述】:

为什么传递错误给我Argument type 'Error' does not conform to expected type 'Swift.Error'

enum AltError: Error {
    case error(Error), initializesWereNil
}


enum ErrorAlt<Preferred, Error> {
    
    case preferred(Preferred)
    case error(AltError)
    
    init?(_ preferred: Preferred?, _ err: Error?) {
        if let preferred = preferred {
            self = .preferred(preferred)
        } else if let passedError = err {
            self = .error(.error(passedError))
        } else {
            self = .error(.initializesWereNil)
        }
    }
}

【问题讨论】:

    标签: swift error-handling


    【解决方案1】:

    ErrorAlt 定义中删除泛型类型Error

    enum ErrorAlt<Preferred> {
        //...
    }
    

    【讨论】:

    • enum ErrorAlt { case preferred(Preferred) case error(Error) case initializesWereNil init?(_ preferred: Preferred?, _ err: Error?) { if let Preferred = Preferred { self = .preferred(preferred) } else if let passError = err { self = .error(passedError) } else { self = .initializesWereNil } } }
    • 一般经验法则:切勿将自定义类型命名为与默认类型相似。重命名Error -> GenericError
    • enum ErrorAlt { case preferred(Preferred) case error(Error) case initializersWereNil init(_ preferred: Preferred?, _ err: Error?) { if let Preferred = Preferred { self = .首选(首选)} else if let passError = err { self = .error(passedError) } else { self = .initializersWereNil } } }
    【解决方案2】:

    通常最好不要使用与其他模块中声明的名称冲突的名称。

    您可以使用其他名称替换 Error 泛型参数,或者使用模块名称显式约束 Swift 的 Error 类型:

    enum ErrorAlt<Preferred, Error: Swift.Error>
    

    【讨论】:

    • 您能否详细说明一下,Swift.Error 是什么?我知道Error 是一个协议。但我不明白它前面的Swift 部分。什么是Swift.Error,它与Error 有何不同?什么是“模块名称”?
    • @Andrej Swift 是包含Error 协议的模块的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多