我有一个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/