如何在Swift 3中覆盖自定义错误的localizedDescription?

Max*_*kin 21 macos inheritance ios swift swift3

错误协议只有一个属性localizedDescription.我试图创建从NSObject和Error继承的自定义对象,但我不能覆盖localizedDescription.我怎样才能做到这一点?

此代码不允许我获取自定义说明:

class MyError: NSObject, Error {
    var desc = ""
    init(str: String) {
        desc = str
    }
    override var description: String {
        get {
            return "MyError: \(desc)"
        }
    }
   var localizedDescription: String {
        get {
            return self.description
        }
    }
}

func test_my_code() {
    let error = MyError(str: "my test string")
    let x = error as Error
    print(x.localizedDescription)
}
Run Code Online (Sandbox Code Playgroud)

调用函数"test_my_code"得到意外结果:"操作无法完成......".

我该怎么做才能得到结果"MyError:my test string"?

OOP*_*Per 44

关于新的错误桥接功能的文档现在还不够清楚,所以这个答案在不久的将来可能需要一些更新,但根据SE-0112最新的Swift源代码,您可能需要使用LocalizedError而不是Error实现errorDescription.

class MyError: NSObject, LocalizedError {
    var desc = ""
    init(str: String) {
        desc = str
    }
    override var description: String {
        get {
            return "MyError: \(desc)"
        }
    }
    //You need to implement `errorDescription`, not `localizedDescription`.
    var errorDescription: String? {
        get {
            return self.description
        }
    }
}

func test_my_code() {
    let error = MyError(str: "my test string")
    let x = error as Error
    print(x.localizedDescription)
}
test_my_code() //->MyError: my test string
Run Code Online (Sandbox Code Playgroud)

除了使用之外LocalizedError,此默认实现有效:

(NSError.swift,上面显示的链接)

public extension Error {
    /// Retrieve the localized description for this error.
    var localizedDescription: String {
        return NSError(domain: _domain, code: _code, userInfo: nil).localizedDescription
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift如何定义_domain或者_code从符合的任意类型开始有点复杂Error,但是NSError对于未知的域和代码组合,它似乎生成"操作无法完成...".


Vla*_*lad 9

如果自定义类型符合协议CustomStringConvertible并提供本地化description,则以下扩展名LocalizedError可能有用:

extension LocalizedError where Self: CustomStringConvertible {

   var errorDescription: String? {
      return description
   }
}
Run Code Online (Sandbox Code Playgroud)

示例代码:

class MyError: LocalizedError, CustomStringConvertible {

   let desc: String

   init(str: String) {
      desc = str
   }

   var description: String {
      let format = NSLocalizedString("Operation error: %@", comment: "Error description")
      return String.localizedStringWithFormat(format, desc)
   }
}


let error = MyError(str: "my test string")
let x = error as Error
print(x.localizedDescription) // Prints "Operation error: my test string"
print(String(describing: x))  // Prints "Operation error: my test string"
Run Code Online (Sandbox Code Playgroud)