Цикл for-in и приведение типов только для объектов, соответствующих типу

Я видел ответы здесь, которые объясняют, как сообщить компилятору, что массив определенного типа в цикле.

Однако дает ли Swift способ, чтобы цикл перебирал только элементы указанного типа в массиве, а не сбой или вообще не выполнял цикл?


person Shuri2060    schedule 07.08.2016    source источник


Ответы (2)


Вы можете использовать цикл for с шаблоном case:

for case let item as YourType in array {
    // `item` has the type `YourType` here 
    // ...
}

Это выполнит тело цикла только для тех элементов в массиве, которые имеют тип (или могут быть приведены) YourType.

Пример (из Пройдите через подвид, чтобы проверить наличие пустого UITextField — быстрый):

for case let textField as UITextField in self.view.subviews {
    if textField.text == "" {
        // ...
    }
}
person Martin R    schedule 07.08.2016
comment
Благодарю вас! Я надеялся на что-то простое в этом роде :) - person Shuri2060; 07.08.2016
comment
О, а также, зацикливается ли он на элементе, если он является подклассом указанного вами класса? - person Shuri2060; 08.08.2016
comment
@QuestionAsker: Да, потому что экземпляр подкласса всегда можно привести к экземпляру суперкласса. - Просто попробуйте! - person Martin R; 08.08.2016
comment
Благодарю вас! И последнее: я изменил его на словарь, так что теперь я должен использовать: for case (let key as String, let item as YourType) in dictionary {...}? Кажется, это работает, но я хочу проверить, будет ли это работать так, как я задумал. - person Shuri2060; 09.08.2016

Учитывая такой массив

let things: [Any] = [1, "Hello", true, "World", 4, false]

вы также можете использовать комбинацию flatMap и forEach для перебора значений Int

things
    .flatMap { $0 as? Int }
    .forEach { num in
        print(num)
}

or

for num in things.flatMap({ $0 as? Int }) {
    print(num)
}

В обоих случаях вы получите следующий вывод

// 1
// 4
person Luca Angeletti    schedule 25.09.2016
comment
flatMap устарел, используйте вместо него compactMap (Swift 4) - person KoreanXcodeWorker; 22.08.2019