Как преобразовать [CustomClass] в [AnyObject]
У меня есть массив пользовательских классов [CustomClass]
, Я пытаюсь преобразовать его в [AnyObject]
,
self.customClassArray = self.anyObjectArray as [AnyObject]
Я получаю следующие ошибки:
AnyObject не является подтипом CustomClass
а также
Невозможно преобразовать значение типа "[CustomClass]" в тип "[AnyObject]" в принудительном порядке.
Что мне не хватает?
3 ответа
По сути, нет сценария, в котором вы бы CustomClass
в AnyObject
,
Ваш пользовательский класс является подтипом AnyObject
а не наоборот, поэтому любая функция, которая требует AnyObject
сможет справиться с вашим CustomClass
1.) Вы можете конвертировать объект суперкласса в тип подкласса.
2.) Вы не можете преобразовать тип объекта SubClass в SuperClass.
Это общее правило наследования.
Те же правила применяются и к принятию протокола.
Например, предположим, у вас есть три класса. Класс А, В, С.
Class A {
}
Класс B является подклассом A.
Class B : A {
}
Класс C является подклассом A.
Class C : A {
}
Другими словами, вы можете сказать, что A является суперклассом класса B и класса c.
у вас есть объекты, как показано ниже.
var objA = A()
var objB = B()
var objC = C()
В этом случае вы можете преобразовать objA в тип класса B или C. т.е.
let objB1 = objA as! B //success
let objC1 = objA as! C //success
Но вы не можете вручную преобразовать objB или objC в тип класса A.
let objA1 : A = objB as! A //will not allowed
Вы можете хранить объект типа Класс B или C для типа класса A без приведения. т.е.
let objA2 : A = objB; // objB is type of class B.
let objA3 : A = objC; // objC is type of class C.
Затем вы можете при необходимости преобразовать objA2 в тип класса B, например,
let objB3 = objA2 as! B
AnyObject - это протокол в Swift.
Протокол, которому неявно соответствуют все классы.
@objc protocol AnyObject
Вам не нужно реализовывать этот протокол вручную, он неявный.
Класс A, B, C также принимает протокол AnyObject,
так что вы можете хранить объект A, B или C для типа AnyObject.
как в нашем вышеприведенном утверждении: let objA2: A = objB; // objB - это тип класса B.
let anyObj1 : AnyObject = objA
let anyObj2 : AnyObject = objB
let anyObj3 : AnyObject = objC
Вы не могли вручную привести тип AnyObject. Вы можете хранить напрямую, как указано выше.
Затем вы можете преобразовать,
anyObj1 для типа A
anyObj2 для типа B
anyObj3 для типа C
class C {
var i: Int = 0
func foo() { print(i) }
init(_ i: Int) { self.i = i }
}
let arrC = [C(1),C(2)]
print(arrC.dynamicType) // Array<C>
let arrO:[AnyObject] = arrC
print(arrO.dynamicType) // Array<AnyObject>
arrO.forEach { (o) -> () in
//o.foo() // error: value of type 'AnyObject' has no member 'foo'
(o as? C)?.foo()
}
то, что вы пытались сделать (если я понял ваш вопрос), приведено [C] как [AnyObject]
let c = arrC
let o = c as [AnyObject]
print(c.dynamicType, o.dynamicType) // Array<C> Array<AnyObject>
который действителен. Если вы получили ошибку, предоставьте больше кода, чтобы мы могли увидеть, в чем ваша проблема.
Сообщение об ошибке кажется действительным, если вы попытались привести [AnyObject] к [C]. И да, такое приведение является недопустимым, поскольку AnyObject не относится к типу C. AnyObject - это протокол, которому соответствуют все классы.