簡體   English   中英

Swift 4中泛型類型的擴展

[英]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 }
    }
}

僅當DataSetElementTwoDimensionalDataPoint時,才有許多方法適用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM