Соответствие строковых значений ассоциативным перечислениям в массиве без учета регистра - PullRequest
0 голосов
/ 31 октября 2019

Как бы вы изменили этот код, чтобы оба res1 и res2 были true?

enum Type: Equatable {
    case int(Int)
    case string(String)
}

func typesContain(_ type: Type) -> Bool {
    let types: [Type] = [.string("abc"), .string("def")]
    return types.contains(type)
}

let res1 = typesContain(.string("abc")) // true
let res2 = typesContain(.string("ABC")) // false

Извинения, если ответ уже существует, я выполнил поиск, но ...

1 Ответ

1 голос
/ 31 октября 2019

Вам просто нужно определить Equatable соответствие самостоятельно. А в случае сравнения двух string случаев используйте string.caseInsensitiveCompare вместо синтезированной реализации по умолчанию, которая просто использует == для двух String связанных значений.

enum Type {
    case int(Int)
    case string(String)
}

extension Type: Equatable {
    static func ==(lhs: Type, rhs: Type) -> Bool {
        switch (lhs, rhs) {
        case (.int(let num), .int(let otherNum)):
            return num == otherNum
        case (.string(let string), .string(let otherString)):
            return string.caseInsensitiveCompare(otherString) == .orderedSame
        default:
            return false
        }
    }
}
...