Ошибка повторного объявления Swift -Enum после обновления до Xcode 11.4, Swift 5.2 - PullRequest
0 голосов
/ 05 мая 2020

У меня есть перечисление, которое отлично работало в Xcode 11.3, Swift 5.1. Я только что перешел на Xcode 11.4 Swift 5.2 и теперь получаю сообщение об ошибке повторного объявления:

enter image description here

enter image description here

Я выполнил глобальный поиск, и нет никаких других перечислений с таким же именем, ни каких-либо других классов или перечислений, которые используют этот метод. До моего обновления такого не было. Я выполнил чистую глубокую очистку и удалил производные данные.

Как я могу исправить эту ошибку?

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

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Поскольку ваш enum уже имеет String в качестве типа необработанного значения, у вас есть автоматически сгенерированное свойство rawValue. Это конфликтует с вашей функцией rawValue(). Однако в этом нет необходимости, поскольку вы можете просто использовать автоматически сгенерированный код:

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 напрямую.

0 голосов
/ 05 мая 2020
protocol RawRepresentableWithDefault: RawRepresentable {
  static var `default`: Self { get }
}

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

extension ActivityType: RawRepresentableWithDefault {
  static let `default` = still
}
...