gpt4 book ai didi

swift - 协议(protocol)中的泛型

转载 作者:搜寻专家 更新时间:2023-11-01 06:55:02 25 4
gpt4 key购买 nike

我有一个 UnitDimension 类:

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

和这个类的一个 UnitVolume 子类:

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

我想要一个协议(protocol)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

感谢您的帮助。

最佳答案

是的,使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com