Arrays 泛型类的类型化数组
考虑以下简化的协议/类层次结构Arrays 泛型类的类型化数组,arrays,swift,generics,Arrays,Swift,Generics,考虑以下简化的协议/类层次结构 protocol P { } class A: P { } class B: P { } class C<T: P> { } obj和obj分别属于[AnyObject]和AnyObject类型。我本以为会是这样的 let objs:[C<P>] = [C<A>(), C<B>()] 完全省略泛型类型,如下所示 let objs:[C] = [C<A>(), C<B>()] 是否有
protocol P {
}
class A: P {
}
class B: P {
}
class C<T: P> {
}
obj
和obj
分别属于[AnyObject]
和AnyObject
类型。我本以为会是这样的
let objs:[C<P>] = [C<A>(), C<B>()]
完全省略泛型类型,如下所示
let objs:[C] = [C<A>(), C<B>()]
是否有任何方法可以创建一个类型比
[AnyObject]
更具体的C
实例数组?考虑以下代码:
// DOES NOT WORK!!
protocol P {
var name: String { get }
}
class A: P {
var name = "A"
}
class B: P {
var name = "B"
}
class C<T: P> {
var val: T
init(val: T) {
self.val = val
}
}
let objs: [C<P>] = [ C<A>(A()) ]
let firstObj: C<P> = obj[0]
firstObj.val = B()
很好的一点是,在这个特定的例子中,赋值是非法的。另一方面,
val
也可以是一个let
常量,您可以对其调用完全有效的协议方法。但是不可能否认前一种情况而支持后一种情况,这就是为什么必须使用包装器。谢谢你的意见!:)你可能也想看看。
let objs:[C] = [C<A>(), C<B>()]
Cannot convert value of type 'NSArray' to specified type '[C]'
// DOES NOT WORK!!
protocol P {
var name: String { get }
}
class A: P {
var name = "A"
}
class B: P {
var name = "B"
}
class C<T: P> {
var val: T
init(val: T) {
self.val = val
}
}
let objs: [C<P>] = [ C<A>(A()) ]
let firstObj: C<P> = obj[0]
firstObj.val = B()
protocol P {
var name: String { get }
}
class A: P {
var name = "A"
}
class B: P {
var name = "B"
}
class C<T: P> {
var val: T
init(_ val: T) {
self.val = val
}
}
/// Type erasing wrapper around C that has accessor for `C.val`
struct AnyC {
let _val: () -> P
var val: P { return _val() }
init<T>(_ c: C<T>) {
_val = { return c.val }
}
}
let objs:[AnyC] = [
AnyC( C<A>(A()) ),
AnyC( C<B>(B()) ),
]
objs[0].val.name // -> "A"
objs[1].val.name // -> "B"