【问题标题】:Swift: Return class constrained with generic typeSwift:返回受泛型类型约束的类
【发布时间】:2016-05-29 09:48:36
【问题描述】:

我有一个基本的泛型类:

class SharedClass<T> {}

还有一个建造者:

class SharedClassBuilder {
    func build<T>() -> SharedClass<T>? {
        return ...
    }
}

我想要做的是返回一个继承SharedClass,并符合T的实例。例如:

protocol MyObject {
    func doIt()
}

var result: SharedClass<MyObject>? = SharedClassBuilder().build()
result?.doIt()

不幸的是,Swift 编译器抱怨返回的类型没有名为 doIt 的成员。

有没有办法实现我正在寻找的东西?

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    我怀疑您并不是希望返回的类受泛型类型的约束,因为您要求返回的类是受约束类型的实例。在您的 sn-p 中,您期望未包装的 result 符合 MyObject。更进一步,这意味着SharedClass 的一致性完全取决于它的构造方式。据我所知,这在 Swift 中不受支持。

    但是,没有什么可以阻止您拥有SharedClass 的成员T。大致如下:

    class SharedClass<T>  {
        var v : T?
    }
    
    class SharedClassBuilder {
        func build<T>() -> SharedClass<T>? {
            return SharedClass()
        }
    }
    
    protocol MyObject {
        func doIt()
    }
    
    var result: SharedClass<MyObject>? = SharedClassBuilder().build()
    result?.v?.doIt()
    

    【讨论】:

    • 这可能是一个不错的选择,谢谢!基本上我所追求的是能够返回某种符合T 的动态代理对象,可能基于NSProxy。 Swift 不喜欢直接返回 T 的想法,可能是因为它不能被实例化。
    • 确实如此。 Swift 喜欢在编译时知道所有事物的类型,以提供更多关于代码安全的保证。但是,如果您愿意将自己限制在继承自 NSObject 的类中,那么您可以很好地实现这一点(基本上就像 NSProxy 所做的那样)。你会失去一些静态保证,但你可能不在乎。您还可以考虑丢失SharedClass,让构建器返回T。特别是如果你只使用协议类型Ts,一切都会在静态下正常运行。
    • 是的,我想到了,使用类而不是 T 的协议的问题是你必须从头到尾实现存根方法,所以实现起来有点奇怪,而如果他们可以传入协议,那就更有意义了。如果 Swift 支持抽象类,这将不是什么大问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多