У меня есть массив, который состоит из AnyObject
. Я хочу перебрать его и найти все элементы, которые являются экземплярами массива.
Как я могу проверить, является ли объект данного типа в Swift?
swift
type-inference
typechecking
Encore PTL
источник
источник
Ответы:
Если вы хотите проверить определенный тип, вы можете сделать следующее:
Вы можете использовать «как!» и это вызовет ошибку времени выполнения, если
obj
не имеет типа[String]
Вы также можете проверить один элемент за раз:
источник
?
нет. Похоже,as
и?
при объединении будет выполнять проверку во время выполнения. Когда было бы целесообразно использоватьas
без?
? Заранее спасибо.as
без?
if, если ваша программа не сможет восстановить объект, не относящийся к этому типу, потому что программа немедленно остановится, если это не так. Использование оператора?
inif
позволяет программе продолжить.?
в этом случае будет выполнять «общую» проверку типа, если да, для предложения if, если нет - для предложения else. Без этого?
никогда не будет введено и, как вы указали, вызвать ошибку во время выполнения. Еще раз спасибо.?
позволяет возвращать присваивание,nil
вызывая возврат оператора iffalse
и, следовательно, переходя к оператору else. Тем не менее, я думаю, что объяснение помогает с пониманием, ноif let
на самом деле это особый случай в компилятореВ Swift 2.2 - 5 теперь вы можете делать:
Затем для фильтрации вашего массива:
Если у вас есть несколько типов для проверки:
источник
object
какString
фигурные скобки (по крайней мере, в Swift 2), а с помощьюlet
решения вы можете это сделать.object
в блоке хорошо.object.uppercaseString
потому что тип переменной не приведен к этому типу, вы просто проверили, что объект (на который указывает переменная) - этоString
Если вы хотите знать , если объект является подтип данного типа , то есть более простой подход:
«Используйте оператор проверки типа (is), чтобы проверить, принадлежит ли экземпляр определенному типу подкласса. Оператор проверки типа возвращает true, если экземпляр принадлежит к этому типу подкласса, и false, если это не так ». Выдержка из: Apple Inc. «Язык программирования Swift». интерактивные книги .
В вышесказанном важна фраза «определенного типа подкласса». Использование
is Circle
иis Rectangle
принимается компилятором, потому что это значениеshape
объявлено какShape
(суперклассCircle
иRectangle
).Если вы используете примитивные типы, суперкласс будет
Any
. Вот пример:источник
is
равно будет работать здесь? Спасибо.object
какAny
. Обновлено с примером.AnyObject
предлагается, кажется, было высказано возражение из-заAnyObject
отсутствия наследования отNSObject
. ЕслиAny
все по-другому, то это было бы действительно отличным решением. Спасибо.У меня есть 2 способа сделать это:
Или:
Вот подробный пример:
Редактировать: 3 сейчас:
источник
isKindOfClass
это методNSObject
протокола; он должен работать только для классов, которые его принимают (все классы, происходящие из NSObject, плюс любой пользовательский класс Swift, который принимает его явно)для swift4:
источник
Предположим, что drawTriangle является экземпляром UIView.To проверить, имеет ли drawTriangle тип UITableView:
В Swift 3 ,
Это также может быть использовано для классов, определенных вами. Вы можете использовать это, чтобы проверить подпредставления представления.
источник
Почему бы не использовать встроенный функционал, созданный специально для этой задачи?
источник
Будьте предупреждены об этом:
Все четыре последние строки возвращают true, потому что если вы наберете
... он печатает "ложь", конечно, но Предупреждение говорит о том, что приведение из CGRect к String завершается неудачно. Таким образом, некоторые типы являются мостовыми, а ключевое слово is вызывает неявное приведение.
Вы должны лучше использовать один из них:
источник
Если вы просто хотите проверить класс без предупреждения из-за неиспользуемого определенного значения (let someVariable ...), вы можете просто заменить let let на логическое значение:
Xcode предложил это, когда я использовал let way и не использовал определенное значение.
источник
Почему бы не использовать что-то подобное
в Свифте 3.
источник
Swift 4.2, в моем случае использую функцию isKind.
Подробнее https://developer.apple.com/documentation/objectivec/nsobjectprotocol/1418511-iskind
источник
myObject as? String
возвращает,nil
еслиmyObject
не являетсяString
. В противном случае он возвращает aString?
, так что вы можете получить доступ к самой строке с помощьюmyObject!
илиmyObject! as String
безопасно преобразовать ее.источник
Свифт 3:
источник
Просто для полноты основанного на принятом ответе и некоторых других:
Но вы также можете (
compactMap
также «сопоставить» значения, которыеfilter
не имеют):И версия, использующая
switch
:Но придерживаясь вопроса, чтобы проверить, если это массив (то есть
[String]
):Или в более общем плане (см. Ответ на этот другой вопрос ):
источник
as?
не всегда даст вам ожидаемый результат , потому чтоas
не проверяет , является ли тип данных является определенного рода , но только если тип данных может быть преобразован в или представить в виде определенного вида.Рассмотрим этот код, например:
Каждый тип данных, соответствующий
Error
протоколу, может быть преобразован вNSError
объект, поэтому это всегда будет успешным . Но это не значит, чтоerror
на самом деле этоNSError
объект или подкласс этого.Правильная проверка типа будет:
Однако это проверяет только точный тип. Если вы хотите также включить подкласс
NSError
, вы должны использовать:источник
Если у вас есть ответ как этот:
и вы хотите проверить значение,
is_stucked
которое будет читаться как AnyObject, все, что вам нужно сделать, этоисточник
Если вы не знаете, что в ответе от сервера вы получите массив словарей или отдельный словарь, вам нужно проверить, содержит ли результат массив или нет.
В моем случае всегда получаю массив словарей, кроме одного раза. Итак, чтобы справиться с этим, я использовал приведенный ниже код для Swift 3.
Вот как? Array проверяет, является ли полученное значение массивом (из словарных элементов). В противном случае вы можете обработать, если это единственный элемент словаря, который не хранится внутри массива.
источник
Swift 5.2 и версия Xcode: 11.3.1 (11C504)
Вот мое решение проверки типа данных:
Я надеюсь, что это поможет вам.
источник