Как проверить, является ли переменная любого типа массивом
Я пытался преобразовать массив протоколов swift как любой массив, но потерпел неудачу.
protocol SomeProtocol: class{
}
class SomeClass: NSObject, SomeProtocol{
}
let protocolArray: [SomeProtocol] = [SomeClass()]
let value: Any? = protocolArray
if let _ = value as? [SomeProtocol]{
print("type check successed") //could enter this line
}
Выше код может работать как ожидалось. Однако моя проблема в том, что у меня много протоколов, и я не хочу проверять их один за другим. Это не дружелюбно, чтобы добавить новый протокол.
Есть ли какой-нибудь удобный способ проверить, является ли вышеуказанное «значение» видом массива, как показано ниже?
if let _ = value as? [Any]{
print("type check successed") //never enter here
}
редактировать:
Вдохновленный ответом Рохита Парсана, может сработать следующий код:
if let arrayType = value?.dynamicType{
let typeStr = "\(arrayType)"
if typeStr.contains("Array"){
print(typeStr)
}
}
Но этот код кажется недостаточно безопасным, например, вы можете объявить класс с именем "abcArray".
Хотя мы могли бы использовать регулярное выражение для проверки соответствия «typeStr» «Array <*>», оно кажется слишком сложным.
Есть ли лучшее решение?