从Swift

时间:2015-07-20 08:52:26

标签: swift generics

我们说我有以下课程。

class Person {
    var name: String?
}

class DataParser<T: AnyObject> {
    var result: T?
}

class PersonParser<T: Person> : DataParser<Person> { }

现在,我想根据传递的模板类型创建另一个实现DataParser子类的类。

class ParserFactory<T: DataParser<AnyObject>> {
    var result: AnyObject?
}

没关系,但可能有更好的方法。结果为AnyObject,但我们知道如果传递的泛型类型为PersonParser,则结果为Person。 我想要做的是调整类,以便我可以将传递的泛型的嵌套泛型类型作为结果类型,这样编译器就可以为我提供正确的对象类型。

我试着编写这段代码,当然,它不会编译。但至少你会得到我想要做的事情。

class ParserFactory<T: DataParser<U: AnyObject>> {
    var result: U?
}

提前致谢。

1 个答案:

答案 0 :(得分:2)

  1. 创建协议:

    protocol A {
        typealias ItemType
    }
    
  2. 使您的班级符合协议:

    class DataParser<T: AnyObject>: A {
        typealias ItemType = T
    
        var result: ItemType?
    }
    
  3. 在另一个类中使用嵌套泛型类型:

    class ParserFactory<T: A> {
        var result: T.ItemType?
    }
    
  4. 检查它是否有效:

    let parserFactory = ParserFactory<DataParser<Person>>()
    
    print(parserFactory.result.dynamicType) //Person