2014-12-05 2 views
3

Я хочу, чтобы проверить, является ли переменная типа массив (может быть [Int], [UIView] или [AnyObject]), а не только определенный тип, как [Int]Как проверить, является ли переменная массивом, но не конкретным типом массива в Swift?

+0

Сравнить http://stackoverflow.com/questions/27132761/how-to-detect-that-parameter-is-tuple-of-two-произвольные типы для аналогичного вопроса о кортежах. Я предполагаю, что ответ может быть изменен для массивов. - Но было бы интересно узнать, почему * вам нужна эта информация и как вы ее используете. –

+1

Трудно представить себе случай, когда вам когда-либо понадобится сделать такой вид проверки вручную. Вы пытаетесь работать с экземпляром 'AnyObject'? Если это так, просто введите 'variable NSArray'. – mattt

ответ

1

Вот возможный тест (v переменная):

let ok = _stdlib_getDemangledTypeName(v) == "Swift.Array" 

Если ok - true, v - это массив какого-то рода.

+0

Просто обратите внимание, что '_stdlib_getDemangledTypeName' (и не-demangled version' _stdlib_getTypeName') являются частью частного Swift API, а не публичного. Это означает, например, что Apple вряд ли одобрит отправленное приложение, используя эти вызовы. –

+1

@MarkReed Это просто слова. Все, что я знаю, это правильно работало над каждой переменной, которую я выбрал. Если вы знаете лучший ответ, дайте ему ответ. – matt

+0

Я не говорю, что это не работает. Но вы, возможно, не сможете полагаться на то, что он продолжает работать в будущих выпусках ... –

2

Я не знаю, если reflect какие-либо более или менее стабильна, чем _stdlib_getDemangledTypeName, но это еще один вариант:

if reflect(myVariable).disposition == MirrorDisposition.IndexContainer { 
    // myVariable is an array 
} else { 
    // myVariable is something else 
} 
0

Следующий код работает, если вы импортируете 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 выше код работает иначе.

0

Вы можете использовать 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

+0

Пожалуйста, добавьте некоторое объяснение, зачем использовать этот код? –

+0

yourArray - это класс NSArray ?, если «true», чем yes, переменная является массивом. Я не могу больше объяснить. Его человеко-читаемый код – mrfoxix

+1

Вы должны обновить ответ не как комментарий. Код только ответ не является хорошим ответом. Он переходит к задаче обзора «низкого качества», когда люди могут голосовать, чтобы удалить ответ. Я нашел ваш ответ там и предложил улучшить ваш ответ, вместо того чтобы проголосовать за удаление. –

0

Это похоже на ситуацию 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 
Смежные вопросы