以下の2つのプロトコルをswift 2でセットアップしました
- アイテムの配列を保持し、カウントや添え字などのデータソースのような機能を提供するジェネレーティブ (より適切な名前がないため)
public protocol Generative {
typealias GeneratedType
var elements: [GeneratedType] { get }
}
public extension Generative {
func count() -> Int {
return elements.count
}
subscript(index:Int) -> GeneratedType? {
if index >= count() {
return nil
}
return elements[index]
}
}
public protocol Selectable {
typealias SelectableType: Hashable
var selectedElements: Set<SelectableType> { get set }
}
extension Selectable {
public func isSelected(elem: SelectableType) -> Bool {
return selectedElements.contains(elem)
}
public mutating func addSelection(elem: SelectableType) {
selectedElements.insert(elem)
}
public mutating func removeSelection(elem: SelectableType) {
selectedElements.remove(elem)
}
public mutating func clearSelections() {
selectedElements.removeAll()
}
}
したがって、オブジェクトが Generative と Selectable の両方を実装する場合、選択したインデックスを返せるようにしたいので、次の関数を書きました。
func selectedIndices<S: Selectable where S: Generative, S.GeneratedType == S.SelectableType>(ds: S) -> [NSIndexPath] {
var selections: [NSIndexPath] {
return ds.selectedElements
.map{ (p: S.GeneratedType) -> NSIndexPath? in
if let idx = ds.elements.indexOf(p) { idx
return NSIndexPath(forRow: idx, inSection: 0)
}
return nil
}
.filter{ $0 != nil }
.map{ $0! }
}
return selections
}
何らかの理由で、リンカーは次のように出力します。
信号が原因でコマンドが失敗しました: セグメンテーション違反: 11
理由がわからないので、この関数を指定して、両方のプロトコルを実装し、関連する型が一致するオブジェクトで動作するようにする別の方法がわかりません...何かアイデアはありますか?
PS Gist のコード: https://gist.github.com/edwardIshaq/715b0e134fb47d2e28cc
------- 計算されたプロパティを削除する更新は、トリックを行うように見えました:
func selectedIndices<S: Selectable where S: Generative, S.GeneratedType == S.SelectableType>(ds: S) -> [NSIndexPath] {
return ds.selectedElements
.flatMap { (p: S.GeneratedType) -> NSIndexPath? in
if let idx = ds.elements.indexOf(p) { idx
return NSIndexPath(forRow: idx, inSection: 0)
}
return nil
}
}