Cómo convertir a

Tengo una matriz de classs personalizadas [CustomClass] . Estoy tratando de convertirlo a [AnyObject] .

 self.customClassArray = self.anyObjectArray as [AnyObject] 

Tengo los siguientes errores:

'AnyObject' no es un subtipo de 'CustomClass'

y

No se puede convertir el valor del tipo '[CustomClass]' para escribir '[AnyObject]' en coacción.

¿Qué me estoy perdiendo?

Básicamente no hay un escenario en el que tendrías que lanzar tu CustomClass a AnyObject .

Su class personalizada es un subtipo de AnyObject y no al revés, por lo tanto, cualquier function que requiera un AnyObject podrá manejar su CustomClass

1.) Puede convertir el object superClass a Tipo de subclass.

2.) No se puede convertir el tipo de object de subclass a SuperClass.

Esta es la regla general de la Herencia.

Las mismas reglas se aplican también a la adopción del protocolo.


Por ejemplo, suponga que tiene tres classs. Clase A, B, C.

 Class A { } 

La class B es la subclass de A.

 Class B : A { } 

La class C es la subclass de A.

 Class C : A { } 

En otras palabras, puede decir que A es superClase de class B y class c.

tienes objects como a continuación.

 var objA = A() var objB = B() var objC = C() 

En este caso, puede convertir objA a tipo de class B o C. es decir

 let objB1 = objA as! B //success let objC1 = objA as! C //success 

Pero no puede convertir manualmente objB u objC al tipo de class A. es decir

 let objA1 : A = objB as! A //will not allowed 

Puede almacenar objects de tipo Clase B o C al tipo de class A sin necesidad de lanzar. es decir

 let objA2 : A = objB; // objB is type of class B. let objA3 : A = objC; // objC is type of class C. 

Luego, puede castear objA2 al tipo de class B cuando sea necesario, como

 let objB3 = objA2 as! B 

AnyObject es un protocolo en Swift.

El protocolo al que todas las classs se ajustan implícitamente.

 @objc protocol AnyObject 

No necesita implementar este protocolo manualmente, está implícito.


La class A, B, C también adopta el protocolo AnyObject,

por lo que puede almacenar el object de A, B o C al tipo de AnyObject.

como nuestra statement anterior :: let objA2: A = objB; // objB es el tipo de class B.

 let anyObj1 : AnyObject = objA let anyObj2 : AnyObject = objB let anyObj3 : AnyObject = objC 

no se pudo convertir manualmente para escribir AnyObject. usted puede almacenar directamente como arriba.

Luego, más adelante, puedes convertir,

anyObj1 para escribir A

anyObj2 para escribir B

anyObj3 para escribir 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() } 

lo que intentaste hacer (si entendí tu pregunta) se lanzó [C] como [AnyObject]

 let c = arrC let o = c as [AnyObject] print(c.dynamicType, o.dynamicType) // Array<C> Array<AnyObject> 

que es válido Si recibió un error, proporcione más código para que podamos ver dónde está su problema.

El post de error parece válido si intentó lanzar [AnyObject] como [C]. Y sí, una conversión de este tipo es ilegal, ya que AnyObject no es tipo de C. AnyObject es un protocolo al que se ajustan todas las classs

    Intereting Posts