Swift: casting Any to array of protocol objects -
there protocol:
protocol valuable { func value() -> int }
and class implements protocol:
class value: valuable { private let v: int init(value: int) { v = value } func value() -> int { return v } }
there array of value objects stored in variable of type:
let any: = [value(value: 1), value(value: 2), value(value: 3)]
it possible cast [value]:
let arrayofvalue = as? [value] // [1, 2, 3]
why not possible case [valuable]?
let arrayofvaluable = as! [valuable] // compiler error bad instruction let arrayofvaluable2 = as? [valuable] // nil
updated: in swift3 entirely possible cast [any]
[valuable]
. cast succeed long elements in array can casted; cast fail otherwise.
var strings: [any] = ["cadena"] var mixed: [any] = ["cadena", 12] strings as! [string] // ["cadena"] mixed as? [string] // nil mixed as! [string] // error! not cast value...
previously of swift 2: make [valuable]
out of [any]
must done manually functions map
other answers have explained.
there no covariance nor contravariance generics in swift (as of swift 2). means arrays of different types, [string]
or [uiview]
, cannot casted each other, nor types compared.
[uiview]
, [uibutton]
bear no hierarchy between each other regardless uibutton
subclass of uiview
. why if following returns true:
valuable.self any.type // true
the following casts yield errors same reason:
var anyarray: [any] = ["cadena"] anyarray as! [string] // bad_instruction error "some string" as! double // bad_instruction error
the 2 clases bear no relation , cast impossible, since as!
forced cast booms error.
Comments
Post a Comment