Я хочу, чтобы проверить, является ли переменная типа массив (может быть [Int]
, [UIView]
или [AnyObject]
), а не только определенный тип, как [Int]
Как проверить, является ли переменная массивом, но не конкретным типом массива в Swift?
ответ
Вот возможный тест (v
переменная):
let ok = _stdlib_getDemangledTypeName(v) == "Swift.Array"
Если ok
- true
, v
- это массив какого-то рода.
Просто обратите внимание, что '_stdlib_getDemangledTypeName' (и не-demangled version' _stdlib_getTypeName') являются частью частного Swift API, а не публичного. Это означает, например, что Apple вряд ли одобрит отправленное приложение, используя эти вызовы. –
@MarkReed Это просто слова. Все, что я знаю, это правильно работало над каждой переменной, которую я выбрал. Если вы знаете лучший ответ, дайте ему ответ. – matt
Я не говорю, что это не работает. Но вы, возможно, не сможете полагаться на то, что он продолжает работать в будущих выпусках ... –
Я не знаю, если reflect
какие-либо более или менее стабильна, чем _stdlib_getDemangledTypeName
, но это еще один вариант:
if reflect(myVariable).disposition == MirrorDisposition.IndexContainer {
// myVariable is an array
} else {
// myVariable is something else
}
Следующий код работает, если вы импортируете Foundation
func isArray(value: AnyObject) -> Bool {
return value is [AnyObject]
}
Однако, если вы не 't import Foundation
дает ошибку, поскольку «[AnyObject] не соответствует протоколу AnyObject».
Причина этого быстрого компилятора ведет себя по-другому при импорте Foundation
. Только классы соответствуют AnyObject
. Any
протокол для всех (класс, структура, перечисление и т. Д.). Таким образом, без импорта Foundation
тип Array
является структурным типом, и он не соответствует протоколу AnyObject
в swift. Когда вы импортируете Foundation
, быстрый компилятор неявно преобразует Array
в NSArray
, и он становится классом и, конечно же, соответствует AnyObject
. Вот почему при импорте Foundation
выше код работает иначе.
Вы можете использовать NSObject метод "isKindOfClass()", чтобы проверить, если переменная магазина экземпляр класса, который вы хотите, чтобы сравнить его:
let isArray: Bool = myVariable.isKindOfClass(NSArray)
// OR
if myVariable.isKindOfClass(NSArray) {
// whatever
}
или:
let isArray: Bool = myVariable is NSArray
// OR
if myVariable is NSArray {
// whatever
}
«isKindOfClass () «работает только с классами, которые являются подклассами NSObject
« is »работает с любым классом в Swift
Пожалуйста, добавьте некоторое объяснение, зачем использовать этот код? –
yourArray - это класс NSArray ?, если «true», чем yes, переменная является массивом. Я не могу больше объяснить. Его человеко-читаемый код – mrfoxix
Вы должны обновить ответ не как комментарий. Код только ответ не является хорошим ответом. Он переходит к задаче обзора «низкого качества», когда люди могут голосовать, чтобы удалить ответ. Я нашел ваш ответ там и предложил улучшить ваш ответ, вместо того чтобы проголосовать за удаление. –
Это похоже на ситуацию checking if an Any.Type
is an optional.
As of Swift 2 язык не хватает covariance and contravariance. Также чеки против typelessArrays
(или любые безличные generic) по-прежнему не поддерживаются.
Как и в случае Any.Type
-is- Optional
, Array
, может быть расширен для реализации протокола, который может быть проверен родственным бестипового массива:
protocol ArrayProtocol{}
extension Array: ArrayProtocol {}
["one", "two"] is ArrayProtocol // true
[12, true, "nay"] is ArrayProtocol // true
"not an array" is ArrayProtocol // false
- 1. Проверьте, является ли переменная конкретным типом интерфейса в объединении типов.
- 2. Как проверить, является ли WeakTypeTag или Type конкретным типом?
- 3. Как проверить, является ли переменная конкретным классом в python?
- 4. Как проверить, является ли переменная любого типа массивом
- 5. Локальная переменная массива не является массивом
- 6. Form1 является типом, но используется как переменная
- 7. Form1 является типом, но используется как переменная
- 8. Как проверить, является ли переменная объектом или массивом
- 9. Проверьте, является ли переменная массивом
- 10. проверить, является ли переменная типа массива в жидкости
- 11. Проверьте, является ли тип переменной конкретным типом в Python
- 12. Как определить, является ли переменная массивом
- 13. Проверьте, является ли переменная числом или массивом
- 14. Как проверить, объявлена ли переменная в Swift?
- 15. Как проверить, не является ли переменная переменной?
- 16. Как проверить, является ли элемент массива самим массивом?
- 17. Как определить, является ли переменная массивом армадильо?
- 18. Как проверить, является ли второй ключ массива массивом?
- 19. Как проверить, является ли MethodInfo.ReturnType типом System.Void?
- 20. Является ли строка [] не типом?
- 21. Как объявить, что конкретная переменная является массивом?
- 22. Как проверить, является ли переменная ссылкой «класс»
- 23. Как определить, является ли переменная массивом объектов или нет?
- 24. Как проверить, является ли объект типом коллекции в Java?
- 25. Как проверить, является ли значение пустым массивом?
- 26. Как проверить, является ли ObjCPropertyRefExpr типом UITextField
- 27. Как проверить, является ли переменная кортежем в TypeScript
- 28. Как проверить, является ли объект массивом объектов
- 29. ApplicationBar является типом, но используется как переменная в представлении панорамы
- 30. Как проверить, является ли какой-либо из предков текущего типа документа конкретным типом в Umbraco?
Сравнить http://stackoverflow.com/questions/27132761/how-to-detect-that-parameter-is-tuple-of-two-произвольные типы для аналогичного вопроса о кортежах. Я предполагаю, что ответ может быть изменен для массивов. - Но было бы интересно узнать, почему * вам нужна эта информация и как вы ее используете. –
Трудно представить себе случай, когда вам когда-либо понадобится сделать такой вид проверки вручную. Вы пытаетесь работать с экземпляром 'AnyObject'? Если это так, просто введите 'variable NSArray'. – mattt