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

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

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

Ответы на вопрос(2)

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

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

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

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

или же

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

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

// 1
// 4
 KoreanXcodeWorker22 авг. 2019 г., 12:30
flatMap устарела, используйте вместо этого compactMap (Swift 4)
Решение Вопроса

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

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

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

for case let textField as UITextField in self.view.subviews {
    if textField.text == "" {
        // ...
    }
}
 Shuri206008 авг. 2016 г., 11:40
Да, а также, зацикливается ли он на элементе, если он является подклассом указанного класса?
 Martin R08 авг. 2016 г., 11:43
@QuestionAsker: Да, потому что экземпляр подкласса всегда можно привести к экземпляру суперкласса. - Просто попробуйте!
 Shuri206009 авг. 2016 г., 12:49
Спасибо! Последнее, что я изменил на словарь, так что теперь я должен использовать:for case (let key as String, let item as YourType) in dictionary {...}? Кажется, это работает, но я хочу проверить, будет ли это работать так, как я намереваюсь
 Shuri206007 авг. 2016 г., 12:45
Спасибо! Я надеялся на что-то простое, как это :)

Ваш ответ на вопрос