首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新到Xcode11.4、Swift 5.2后的Swift -Enum重定义错误

更新到Xcode11.4、Swift 5.2后的Swift -Enum重定义错误
EN

Stack Overflow用户
提问于 2020-05-05 07:21:00
回答 2查看 116关注 0票数 0

我有一个在Xcode11.3,Swift 5.1中运行良好的枚举。我刚刚升级到Xcode 11.4 Swift 5.2,现在我得到了一个重新声明错误:

我做了一个全局搜索,没有任何其他枚举具有相同的名称,也没有任何其他类或枚举使用该方法。在我升级之前它从来没有发生过。我做了一个干净的,深入的清理,并清除了派生的数据。

如何修复此错误?

代码语言:javascript
复制
enum ActivityType: String {

    case north
    case south
    case east
    case west
    case up
    case down
    case still

    static func value(from raw: String?) -> ActivityType {
        switch raw {
        case ActivityType.north.rawValue():
            return .north
        case ActivityType.south.rawValue():
            return .south
        case ActivityType.east.rawValue():
            return .east
        case ActivityType.west.rawValue():
            return .west
        case ActivityType.up.rawValue():
            return .up
        case ActivityType.down.rawValue():
            return .down
        case ActivityType.still.rawValue():
            return .still
        default:
            return .still
        }
    }

    func rawValue() -> String { // error occurs here
        switch self {
        case .north:
            return "north"
        case .south:
            return "south"
        case .east:
            return "east"
        case .west:
            return "west"
        case .up:
            return "up"
        case .down:
            return "down"
        case .still:
            return "still"
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-05 07:36:47

由于您的enum已经将String作为原始值类型,因此您将拥有一个自动生成的rawValue属性。它与您的rawValue()函数冲突。但是,这是不必要的,因为您可以只使用自动生成的代码:

代码语言:javascript
复制
enum ActivityType: String {

    case north, south, east, west, up, down, still

    static func value(from rawValue: String?) -> ActivityType {
        guard let rawValue = rawValue, let activityType = ActivityType(rawValue: rawValue) else {
            return .still
        }
        return activityType
    }

}

上面的代码与您的代码执行相同的操作。当然,这在很大程度上也是不必要的,因为您可以直接使用ActivityType(rawValue: myString) ?? .still

票数 3
EN

Stack Overflow用户

发布于 2020-05-05 09:10:39

代码语言:javascript
复制
protocol RawRepresentableWithDefault: RawRepresentable {
  static var `default`: Self { get }
}

extension RawRepresentableWithDefault {
  init(rawValue: RawValue?) {
    self = rawValue.flatMap(Self.init) ?? .default
  }
}
代码语言:javascript
复制
enum ActivityType: String {
  case north, south, east, west, up, down, still
}

extension ActivityType: RawRepresentableWithDefault {
  static let `default` = still
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61603251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档