Swift 4 - 关联类型的子类通用约束

标签 swift generics swift4

我想编写一个 Swift 协议(protocol),它需要一个类型来指定一个基类并实现对该基类的子类进行操作的方法。这可能看起来像(不编译):

protocol Repository {

    associatedtype BaseModel

    //T must subclass BaseModel 
    func all<T: BaseModel>(from type: T.Type) -> [T] 
}

但这会产生以下编译器错误: 从非协议(protocol)、非类类型“Self.BaseModel”继承

这是有道理的,因为可以使用结构类型指定 BaseModel 并且不允许子类化。所以我尝试创建一个空协议(protocol),约束类,试图通知编译器该类型将是类类型并允许子类约束。

协议(protocol)模型:类{}

然后我使用模型类协议(protocol)约束了 BaseModel 类型:

关联类型 BaseModel:模型

但这会产生与上面相同的编译器错误。是否可以在协议(protocol)上从 associatedtype 强制执行子类约束?我希望上面的代码能够编译,或者 Swift 允许像下面这样的东西来允许子类约束:

关联类型 BaseModel:类

最佳答案

如果在实现协议(protocol)之前类型未知,则应使用关联类型。但如果类型已知,则无需使用关联类型。我想你可以做到这一点。

protocol Model: class { }

class BaseModel : Model { }

protocol Repository {
        func all<T : BaseModel>(from type: T.Type) -> [T]
}

关于Swift 4 - 关联类型的子类通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44490441/

相关文章:

ios - 使用 Parse findObjectInBackground() 在 iOS 中设置 View

swift - 带有默认实现的 swift 中的观察者模式

ios - 两个 NSFetchResultControllers ,一个 TableViewController

java - 转换为通用类型时 Java 中的警告

ios - Swift 4 中的 setValuesForKeysWithDictionary?

ios - 从数组 swift 访问图像

reactjs - TypeScript:从类型/减法类型中删除键

generics - 如何在F#中声明通用异常类型

ios - Swift - UIViewControllerAnimatedTransitioning 未按预期使用 Swift4 进行转换

ios - 重新加载数据时 UICollectionView 滚动性能降低