协议中的泛型
Generics in protocols
我有 UnitDimension
class 给:
class UnitDimension: {
var symbol: String
init(symbol: String) {
self.symbol = symbol
}
}
和这个 class 的 UnitVolume
子 class:
class UnitVolume: UnitDimension {
static let liter = UnitVolume(symbol: "L")
}
我想要一个允许我执行一些简单功能的协议 UnitDimensionHandler
。首先它必须有一个 allUnits
变量:
protocol UnitDimensionHandler: class {
static var allUnits: [UnitDimension] { get }
}
是否有可能 allUnits
必须是 UnitDimension
的子class 的通用数组类型? 我可以在 UnitVolume
中实现如下:
extension UnitVolume: UnitDimensionHandler {
static var allUnits: [UnitVolume] {
return [liter]
}
}
然后我想包含一个函数,该函数还允许我使用启动 UnitDimension
实例的通用子class 类型:
extension UnitDimensionHandler {
static func unit(for symbol: String) -> UnitDimension? {
return allUnits.first() { [=14=].symbol == symbol }
}
}
这样 UnitVolume.unit(for: "L")
returns 一个可选的 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() { [=11=].symbol == symbol }
}
}
我有 UnitDimension
class 给:
class UnitDimension: {
var symbol: String
init(symbol: String) {
self.symbol = symbol
}
}
和这个 class 的 UnitVolume
子 class:
class UnitVolume: UnitDimension {
static let liter = UnitVolume(symbol: "L")
}
我想要一个允许我执行一些简单功能的协议 UnitDimensionHandler
。首先它必须有一个 allUnits
变量:
protocol UnitDimensionHandler: class {
static var allUnits: [UnitDimension] { get }
}
是否有可能 allUnits
必须是 UnitDimension
的子class 的通用数组类型? 我可以在 UnitVolume
中实现如下:
extension UnitVolume: UnitDimensionHandler {
static var allUnits: [UnitVolume] {
return [liter]
}
}
然后我想包含一个函数,该函数还允许我使用启动 UnitDimension
实例的通用子class 类型:
extension UnitDimensionHandler {
static func unit(for symbol: String) -> UnitDimension? {
return allUnits.first() { [=14=].symbol == symbol }
}
}
这样 UnitVolume.unit(for: "L")
returns 一个可选的 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() { [=11=].symbol == symbol }
}
}