Разница происходит от разницы от Проверка типа in:
- время выполнения или
- время компиляции
Оператор is
во время выполнения проверяет, можно ли привести выражение к указанному типу.type(of:)
проверяет во время выполнения точный тип без учета подклассов.
anyArray[0].name
не компилируется, поскольку тип Any
не имеет свойства name
.
Если вы уверены, что anyArray[0]
- это Object1
, вы можете использовать оператор downcast as!
:
print("\((anyArray[0] as! Object1).name)")
Чтобы проверить во время выполнения, может ли элемент из anyArray
быть Object1
используйте необязательную привязку, используя оператор условного приведения as?
:
, если разрешено:
if let object = anyArray[0] as? Object1 {
print(object.name)
}
Или используйте guard
оператор, если вы хотите использовать этот объект в остальной области:
guard let object = anyArray[0] as? Object1 else {
fatalError("The first element is not an Object1")
}
print(object.name)
Если все объекты в вашем массиве имеют свойство name
, и выне хочу многократно проходить через все циклы необязательного связывания, а затем использовать протокол.Ваш код будет выглядеть следующим образом:
protocol Named {
var name: String {get set}
}
class Object1: Named {
var name = "Object1"
}
var anyArray:[Named] = [Object1()]
print("\(type(of: anyArray[0]))")
let testResult = anyArray[0] is Object1
print("Test result:\(testResult)")
print("Name:\(anyArray[0].name)")
Обратите внимание, что anyArray
теперь является массивом Named
объектов и что Object1
соответствует протоколу Named
.
Чтобы узнать больше о протоколах, посмотрите здесь .