【问题标题】:Convert Objective-C enum to Swift String将 Objective-C 枚举转换为 Swift 字符串
【发布时间】:2016-02-10 14:43:06
【问题描述】:

我正在尝试将 iOS 错误代码转换为 Swift 2 (XCode 7.2) 中的字符串。但是转换为 String 会返回 type name 而不是 value name 用于系统枚举。

这就是我正在尝试的:

import CoreLocation
import EventKit

let clError = CLError.LocationUnknown
let clErrorString = "\(clError)"
// EXPECTED: 'LocationUnknown'. OBTAINED: 'CLError'

let ekError = EKErrorCode.CalendarIsImmutable
let ekErrorString = "\(ekError)"
// EXPECTED: 'CalendarIsImmutable'. OBTAINED: 'EKErrorCode'

但是使用 Swift 中声明的枚举,这可以按预期工作:

enum _EKErrorCode : Int {
    case CalendarIsImmutable
}

let _ekError = _EKErrorCode.CalendarIsImmutable
let _ekErrorString = "\(_ekError)"
// EXPECTED: 'CalendarIsImmutable'. OBTAINED: 'CalendarIsImmutable'

我正在尝试避免使用所有可能的枚举值的 Switch-Case,或者通过添加自定义描述来扩展系统类型。

【问题讨论】:

  • CLError 是否有任何显示错误信息的属性?
  • 只有可见的方法是rawValue 和hashValue。两者都返回一个整数值。
  • 显然你需要扩展系统类型或使用开关盒,你为什么要避免这些?
  • 创建一个switch 并为每个枚举值分配一个String。这是你唯一的选择。
  • @matt 我试图避免枚举所有值,因为它不是面向未来的。添加到新 iOS 版本的任何新的可能错误都会破坏代码。

标签: ios swift enums swift2


【解决方案1】:

这可以通过以下方式实现,而无需使用ClError.Code扩展名手动检查案例

extension CLError.Code {
    func getErrorDescription() -> String {
        return String(describing: self)
    }
}

用法:

let clError = CLError.locationUnknown
print (clError.getErrorDescription())

【讨论】:

  • uhm:这些天在 Swift 4.2 和 Xcode 10.1 上尝试过,在我看来,这种方法不再适用了。不得不求助于切换
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2015-06-10
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多