我有一个UnitDimension课程,由:

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

以及这个类的一个子类:
class UnitVolume: UnitDimension {
    static let liter = UnitVolume(symbol: "L")
}

我想有一个协议UnitVolume允许我执行一些简单的功能。首先,它必须有一个UnitDimensionHandler变量:
protocol UnitDimensionHandler: class {
    static var allUnits: [UnitDimension] { get }
}

是否可以有一个必须是allUnits的子类的泛型数组类型allUnits?然后我可以在UnitDimension中实现它,如下所示:
extension UnitVolume: UnitDimensionHandler {
    static var allUnits: [UnitVolume] {
        return [liter]
    }
}

然后,我希望包含一个函数,该函数还允许我使用泛型子类类型来启动一个UnitVolume实例:
extension UnitDimensionHandler {
    static func unit(for symbol: String) -> UnitDimension? {
        return allUnits.first() { $0.symbol == symbol }
    }
}

这样UnitDimension返回一个可选的UnitVolume.unit(for: "L"),而不是一个可选的UnitVolume
谢谢你的帮助。

最佳答案

是的,可以使用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 }
    }
}

关于swift - 协议(protocol)中的泛型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54039190/

10-09 04:16