大佬教程收集整理的这篇文章主要介绍了arrays – Swift – 如何存储在泛型类型的Array子类中,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将这些子类的实例存储在一个数组中,这样它们就可以迭代并以相同的方式处理所有这些子类,但显然,没有办法将子类转换为泛型超类.
以下是一些说明问题的代码(您可以将其复制粘贴到操场中以查看结果):
// Lets create regular classes class Fruit { var text: String { return "I am some Fruit" } } class Apple: Fruit { override var text: String { return "I am an Apple" } } class Orange: Fruit { override var text: String { return "I am an Orange" } } // This obvIoUsly works: let test1: Fruit = Apple() let test2: Fruit = Orange() // Let's create some generic class class Tree<T: Fruit> { let fruit: T init(fruit: T) { self.fruit = fruit } } // Subclasses from the generic class (these work) class AppleTree: Tree<Apple> { convenience init() { self.init(fruit: Apple()) } } class OrangeTree: Tree<Orange> { convenience init() { self.init(fruit: Orange()) } } // This works: let tree: Tree<Fruit> = Tree(fruit: Apple()) tree.fruit.text // "I am an Apple" // This works: let appleTree1: Tree<Apple> = AppleTree() appleTree1.fruit.text // "I am an Apple" // This fails: "CAnnot convert value of type 'AppleTree' to specified type 'Tree<Fruit>' let appleTree2: Tree<Fruit> = AppleTree() // This works: let fruitArray: [Fruit] = [Apple(),Orange()] // THIS IS MY GOAL: // This fails: "CAnnot convert value of type 'AppleTree' to specified type 'Tree<Fruit>' let treeArray: [Tree<Fruit>] = [AppleTree(),OrangeTree()] // Let's try with a generic subclass class FruitTree<T: Fruit>: Tree<T>{} // This works: let genericTree: Tree<Fruit> = FruitTree(fruit: Apple()) // Let's try with a generic but more concrete subclass class GenericOrangeTree<T: Orange>: Tree<T>{ convenience init() { self.init(fruit: Orange() as! T) } } // This works: let genericOrangeTree1 = GenericOrangeTree(fruit: Orange()) let genericOrangeTree2 = GenericOrangeTree() // This fails: CAnnot invoke initializer for type 'GenericOrangeTree<Orange>' with an argument list of type '(fruit: OrangE)' let genericTree2: Tree<Fruit> = GenericOrangeTree(fruit: Orange()) // Again,this fails: "CAnnot convert value of type 'GenericOrangeTree<Orange>' to specified type 'Tree<Fruit>' let genericTreeArray: [Tree<Fruit>] = [GenericOrangeTree()]
如果你说
Generic<SubClass1> Generic<SuperClass>
这些由编译器解析为类型:
class Generic_SubClass1 { let property : SubClass1 } class Generic_SuperClass { let property : SuperClass }
在解析泛型之后,这两种类型不共享基本类型,因此不能相互转换.它们是完全分开的.
不确定也没试过,但也许这就是你想要的:
class GenericBase { let property : SuperClass } class Generic<T: SuperClass> : GenericBase { final var typedProperty : T { get { return property as T } set { property = T } } }
然后,您可以使用GenericBase作为公共祖先,并使用动态类型来检查子类.
P.s.:您的代码有点难以理解,可能使用类似’Fruit’,’Apple’和’Orange’的东西 – 比’Superclass’,’Subclass1′,’Subclass2’更容易阅读;-)
以上是大佬教程为你收集整理的arrays – Swift – 如何存储在泛型类型的Array子类中全部内容,希望文章能够帮你解决arrays – Swift – 如何存储在泛型类型的Array子类中所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。