【问题标题】:How to override localizedDescription for custom Error in Swift 3? [duplicate]如何覆盖 Swift 3 中自定义错误的本地化描述? [复制]
【发布时间】:2017-05-10 14:54:08
【问题描述】:

错误协议has only one 属性localizedDescription。 我试图创建从 NSObject 和 Error 继承的自定义对象,但我无法覆盖本地化描述。我该怎么做?

此代码不允许我获取自定义描述:

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)
}

调用函数“test_my_code”得到意外结果: “操作无法完成……”。

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

【问题讨论】:

  • 你不需要override吗?
  • 你不能用一个新的属性来扩展 Error 然后读它吗?
  • @SunilChauhan 没有。协议中的任何内容都不应被覆盖。添加override 会中断编译。
  • @Honey 我不想扩展协议。我只想制作符合错误协议的自定义类。
  • @Speakus 哎呀,错过了。!

标签: ios swift macos inheritance swift3


【解决方案1】:

关于新的错误桥接功能的文档现在还不够清楚,所以这个答案可能需要在不久的将来进行一些更新,但根据SE-0112latest Swift source code,您可能需要使用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

除了使用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
    }
}

Swift 如何从符合Error 的任意类型定义_domain_code 有点复杂,但似乎NSError 生成“操作无法完成...”未知域和代码的组合。

【讨论】:

  • 完美!我为此苦苦挣扎,并制作了丑陋的开关/外壳。像魅力一样工作!
【解决方案2】:

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

extension LocalizedError where Self: CustomStringConvertible {

   var errorDescription: String? {
      return description
   }
}

示例代码:

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"

【讨论】:

  • 这是最好的答案。说真的,遵守CustomStringConvertible 并提供var description: String
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2017-01-03
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多