[英]Extensions of generic types in Swift 4
我有兩個協議和一個通用結構:
public protocol OneDimensionalDataPoint {
/// the y value
var y: Double { get }
}
public protocol TwoDimensionalDataPoint: OneDimensionalDataPoint {
/// the x value
var x: Double { get }
}
public struct DataSet<Element: OneDimensionalDataPoint> {
/// the entries that this dataset represents
private var _values: [Element]
//...implementation
}
extension DataSet: MutableCollection {
public typealias Element = OneDimensionalDataPoint
public typealias Index = Int
public var startIndex: Index {
return _values.startIndex
}
public var endIndex: Index {
return _values.endIndex
}
public func index(after: Index) -> Index {
return _values.index(after: after)
}
public subscript(position: Index) -> Element {
get{ return _values[position] }
set{ self._values[position] = newValue }
}
}
僅當DataSet
的Element
是TwoDimensionalDataPoint
時,才有許多方法適用於DataSet
。 所以我做了一個擴展,像這樣:
extension DataSet where Element: TwoDimensionalDataPoint {
public mutating func calcMinMaxX(entry e: Element) {
if e.x < _xMin {
_xMin = e.x
}
if e.x > _xMax {
_xMax = e.x
}
}
}
編譯器不喜歡這樣,並說:
類型'DataSet.Element'(也稱為'OneDimensionalDataPoint')的值沒有成員'x'
這不是很好,因為我在擴展TwoDimensionalDataPoint
Element限制為TwoDimensionalDataPoint
嗎?
在將其放入Xcode之后,我可以更好地了解正在發生的事情,
您的問題是您的類型別名覆蓋了您的通用類型,
將通用名稱重命名為T
並將Element分配給T
public typealias Element = T
或您的打字別名:
public typealias DataElement = OneDimensionalDataPoint
或將所有的typealias放在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.