Swift String hasPrefix Использование массива строк - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу избежать оператора if в приведенном ниже примере кода и вместо этого сделать один вызов hasPrefix в моей числовой строке и передать массив prefixes. Есть ли способ сделать это в Swift?

let prefixes: [String] = ["212", "213", "214"]
let number: String = "213-555-1212"

if number.hasPrefix("212") || number.hasPrefix("213") {
    print("found")
}

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Это можно сделать кратко:

if prefixes.contains(where: number.hasPrefix) {
    print("found")
}

Итак, как это работает?

  1. contains(where:) принимает замыкание, которое вызывается для каждого элемента массива prefixes, чтобы решить, соответствует ли элемент требуемому условию. Поскольку prefixes является массивом String, это замыкание имеет подпись (String) -> Bool, то есть оно принимает String и возвращает Bool. contains(where:) будет продолжать вызывать данное замыкание для каждого элемента в массиве prefixes до тех пор, пока не получит возвращенный true, или пока не закончится количество элементов в массиве prefixes, и тогда ответ будет false (prefixes не содержит предмет, который соответствует условию).

  2. В этом случае мы передаем функцию number.hasPrefix в качестве замыкания. Обычно вы используете number.hasPrefix, вызывая его с аргументом, подобным следующему: number.hasPrefix("212"). Без аргумента number.hasPrefix относится к функции hasPrefix, вызываемой для number, и эта функция имеет сигнатуру, которую мы ищем: (String) -> Bool. Таким образом, это может использоваться в качестве закрытия для contains(where:).

  3. Итак, prefixes.contains(where: number.hasPrefix) берет каждый prefix из массива и проверяет, возвращает ли number.hasPrefix(prefix) true. Если он находит, он прекращает поиск и возвращает true. Если все они возвращают false, то prefixes.contains(where:) возвращает false.

0 голосов
/ 16 ноября 2018

Как насчет:

prefixes.forEach { prefix in
    if number.hasPrefix(prefix) {
        print("found")
    }
}

Возможно, вы захотите убедиться, что массив prefixes не имеет дубликатов (= фактически является набором).

0 голосов
/ 16 ноября 2018

Если важна читабельность, вы можете попробовать это:

extension String {
    func hasAnyPrefix(_ prefixes: [String]) -> Bool {
        return prefixes.contains { self.hasPrefix($0) }
    }
}

if number.hasAnyPrefix(prefixes) {
    print("found")
}
0 голосов
/ 16 ноября 2018

Вы можете попробовать

if prefixes.filter { number.hasPrefix($0)}.count != 0 {

}

Или

!prefixes.filter { number.hasPrefix($0)}.isEmpty 

Или

prefixes.contains { number.hasPrefix($0) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...