Быстрое приведение к протоколу возвращает ноль - PullRequest
0 голосов
/ 05 марта 2019

У меня есть массив некоторых значений одного типа протокола. Мне нужно привести эти значения к другому типу протокола, чтобы я мог получить доступ к методу из него. Но кастинг для меня возвращается ноль. Зачем? Каковы условия преобразования из одного типа протокола в другой тип протокола?

Protocol Source: CustomStringConvertible, InputDescribeable {
 func getAnimals() -> [Source]}

Protocol Map {
func MapTOAnimal() -> ProtocolX
}

Class Test {
let try = dog.getAnimals() // I have 4 values here of type [Source]
let trytry = try as? Map // returns nil
let needed = trytry.MapToAnimal
}

1 Ответ

1 голос
/ 05 марта 2019

Чтобы ответить на ваш последний вопрос, вы можете привести другой протокол, который расширяет первый протокол, или если оба реализуют один и тот же протокол.Рассмотрим следующий пример

protocol A: CustomStringConvertible {
    func doA() -> Void
}

protocol B: A {
    func doB() -> Void
}

protocol C: CustomStringConvertible {
    func doC() -> Void
}


let arrB = [B]()

let arrA = arrB as! [A]

let arrC = [C]()

let arrD = arrC as! [A]

for  b in arrB {
    b.doB()
    b.doA()
}

for a in arrA {
    a.doA()
    //a.doB()  compilaion error
}

for c in arrC {
    c.doC()
    let descr = c.description
}

for d in arrD {
    // d.doC() compilaion error
    let descr = d.description
}
...