0

2 つのプロトコルと一般的な構造体があります。

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。そこで、次のような拡張機能を作成しました。

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 を制約したので、これでいいのではないでしょうか?

4

1 に答える 1

1

それを Xcode に取り込んだ後、何が起こっているのかをよりよく理解することができました。

あなたの問題は、型エイリアスがジェネリック型をオーバーライドしていることです。

一般的な名前をに変更しT、要素を割り当てますT

public typealias Element = T

または次のようなタイプエイリアス:

public typealias DataElement = OneDimensionalDataPoint

または、タイプエイリアスをすべて一緒にドロップします。

于 2017-06-18T00:09:26.833 に答える