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"