协议中的泛型

时间:2019-01-04 12:41:23

标签: swift generics protocols

我有一个UnitDimension类,由以下人员提供:

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

和该类的UnitVolume子类:

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

我想拥有一个协议UnitDimensionHandler,该协议可以让我执行一些简单的功能。首先,它必须具有一个allUnits变量:

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

是否可以使allUnits的通用类型的数组必须是UnitDimension的子类?然后,我可以在UnitVolume中实现它,如下所示:

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

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

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

使得UnitVolume.unit(for: "L")返回可选的UnitVolume而不是可选的UnitDimension

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

是的,可以使用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() { $0.symbol == symbol }
    }
}