我有一个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
。
感谢您的帮助。
答案 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 }
}
}