协议中的泛型

Generics in protocols

我有 UnitDimension class 给:

class UnitDimension: {
    var symbol: String
    init(symbol: String) {
        self.symbol = symbol
    }
}

和这个 class 的 UnitVolume 子 class:

class UnitVolume: UnitDimension {
    static let liter = UnitVolume(symbol: "L")
}

我想要一个允许我执行一些简单功能的协议 UnitDimensionHandler。首先它必须有一个 allUnits 变量:

protocol UnitDimensionHandler: class {
    static var allUnits: [UnitDimension] { get }
}

是否有可能 allUnits 必须是 UnitDimension 的子class 的通用数组类型? 我可以在 UnitVolume 中实现如下:

extension UnitVolume: UnitDimensionHandler {
    static var allUnits: [UnitVolume] {
        return [liter]
    }
}

然后我想包含一个函数,该函数还允许我使用启动 UnitDimension 实例的通用子class 类型:

extension UnitDimensionHandler {
    static func unit(for symbol: String) -> UnitDimension? {
        return allUnits.first() { [=14=].symbol == symbol }
    }
}

这样 UnitVolume.unit(for: "L") returns 一个可选的 UnitVolume 而不是一个可选的 UnitDimension.

感谢您的帮助。

可以,使用 associatedtype:

protocol UnitDimensionHandler: class {
    // here we define `generic` type variable `Dimension`, and specify it do be descendant of `UnitDimension`
    associatedtype Dimension: UnitDimension

    // and use it here, instead of `UnitDimension`
    static var allUnits: [Dimension] { get }
}

extension UnitDimensionHandler {
    // same `UnitDimension` -> `Dimension` replacement
    static func unit(for symbol: String) -> Dimension? {
        return allUnits.first() { [=11=].symbol == symbol }
    }
}