Как преобразовать [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 - это протокол, которому соответствуют все классы.

Другие вопросы по тегам