使用swift中泛型类派生的类的限制

时间:2014-06-10 10:13:42

标签: class generics swift

我正在尝试从泛型类派生我的类:

class foo<T> {}
class bar : foo<Int> {}

但是这段代码无法使用错误编译:

  

从泛型类派生的类也必须是通用的

如何避免此限制?有可能吗?

5 个答案:

答案 0 :(得分:23)

Ssreg,

不幸的是,这是official

  

您可以子类化泛型类,但子类也必须是a   泛类。

让我们希望Apple在未来版本中修复此问题。

与此同时,让我们将此视为利用aggregation而非子类化的机会。

注:

作为穷人的解决方案版本,可以使用typealias

class foo<T> {}
class bar<Int> : foo<Int> {}
typealias Bar = bar<Int>

这样,其余的代码就像Apple已经解决了这个问题一样。

答案 1 :(得分:16)

在Swift 2中,可以将泛型类子类化:

class Something {}

class Base<T> {}

class Fancy : Base<Something> {}

答案 2 :(得分:15)

typealias solution的替代方法是按字面意思理解文档:

  

您可以子类化泛型类,但子类也必须是a   泛类。

因此我们将子类设为泛型类,但我们不会将其用于任何类型。

class foo<T> {

    func doSomething(t:T) -> T {
        return t;
    }
}

class bar<S> : foo<Int> {

    override func doSomething(t:Int) -> Int {
        return t * t;
    }
}

let b : bar = bar<AnyObject>()
b.doSomething(5) // 25 instead of 5

我更喜欢使用此方法来使用typealias,因为它不会使用其他类型污染命名空间。如果子类(bar)意图为publicinternal,则这一点尤为重要。

修改

该文档不再包含有关通用子类限制的短语。希望这意味着Apple计划尽快改变这一点。

答案 3 :(得分:15)

我有同样的问题,我找到了解决方案!

class SomeType {
}
class Foo<T> {
}
class Bar<T: SomeType>: Foo<T> {
}

现在你可以做到:

let bar = Bar()

这将默认Bar的类型设置为SomeType。唯一的缺点是你只能为'subclassable'类型执行此操作。因此,对于Int,这将无效。

答案 4 :(得分:1)

现在已正式支持:

class Foo<RelatedType> {
    var object: RelatedType? = nil

    func myFunction(param: RelatedType) -> RelatedType? {
        return nil
    }
}

class Bar: Foo<String> {
    override func myFunction(param: String) -> String? {
        return self.object
    }
}