Swift: casting Tout à la matrice des objets de protocole

Il y a un protocole:

protocol Valuable {
    func value() -> Int
}

et une classe qui implémente le protocole:

class Value: Valuable {
    private let v: Int

    init(value: Int) {
        v = value
    }

    func value() -> Int {
        return v
    }
}

Il y a un tableau d'objets de Valeur stockée dans une variable de n'Importe quel type:

let any: Any = [Value(value: 1), Value(value: 2), Value(value: 3)]

Il est possible de jeter Tout à [Valeur]:

let arrayOfValue = any as? [Value] // [1, 2, 3]

Pourquoi il n'est pas possible pour des cas Tout à [Précieux]?

let arrayOfValuable = any as! [Valuable] //compiler error BAD INSTRUCTION
let arrayOfValuable2 = any as? [Valuable] // nil
Vous ne pouvez pas avoir les instances d'un protocole directement, mais seulement les structures/classes qui s'y conformer.
Je ne sais pas pourquoi le casting n'est pas de travail mais peut-être déclarer comme [Valuable] en premier lieu serait assez comme une solution pour vous: let any : [Valuable] = [Value(value: 1), Value(value: 2), Value(value: 3)]

OriginalL'auteur Andrii H. | 2015-09-30