Странное поведение switch-case в Swift - PullRequest
1 голос
/ 09 июля 2019

Обычно оператор switch-case работает следующим образом: если условие точно соответствует значению, то выполняется соответствующий блок кода. Но в моем случае что-то пошло не так! Почему у меня работает код для «обновления», а условие «дата»!? Я пытался воссоздать ситуацию на детской площадке - там все работает правильно. В чем проблема?

Почему блок update работает, когда key = "date"? Теоретически, блок default должен работать!?

Мой код:

print("Dictionary = \(dictionary)")

for (key, value) in dictionary {
    switch key {
    case BaseDatabase.COLUMN_ID:
        // My code
    case WeddingDatabase.COLUMN_PREMIUM:
        // My code
    case BaseDatabase.COLUMN_UPDATE_CLEAN:
        print("type = \(BaseDatabase.COLUMN_UPDATE_CLEAN), key = \(key)")
        // My code
    default:
        // My default code
    }
}

Моя консоль:

dictionary = ["note": <null>, "date": 2024-08-08 00:00:00, "update": 2019-07-09 08:57:05, "id_wedding": 1]

type = update, key = date // WHY??
type = update, key = update 

UPDATE:

Сократи код до банального:

let key = "date"
switch key {
    case "update":
        print("key = \(key)")
    break
    default:
        print("default = \(key)")
    break
}  

Добавлен код в viewDidLoad пустом viewController. На консоли все еще отображается key = date. Я вижу проблему ТОЛЬКО в моем проекте. Я попытался добавить код в новый проект и в playgroud - все работает нормально (default = date выводится на консоль). Как это может быть? Я пробовал разные симуляторы (и версии для iOS) - проблема все еще там. Я также пытался очистить проект - проблема не устранена. Может быть, где-то в проекте переопределена работа оператора switch - это возможно?

1 Ответ

2 голосов
/ 10 июля 2019

Я нашел проблему.В расширении класса String оператор ~ = был переопределен следующим образом:

extension String {
    static func ~= (lhs: String, rhs: String) -> Bool {
        return NSRegularExpression(rhs).matches(lhs)
    }
}

Как оказалось, оператор ~= используется в операторе switch.Чтобы исправить ошибку, я заменил это расширение следующим:

extension String {
    func matches(pattern: String) -> Bool {
        return NSRegularExpression(pattern).matches(self)
    }
}

Как я его использую:

if value.matches(pattern: "#[0-9]{1,2}[A-Z]#" {
    // Code
}

При переопределении операторов следует быть очень внимательным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...