独自に作成したクラスをCollectionとして扱いたいことって多いですよね。
そんなときはCollectionプロトコルを継承することで実現が可能です。
・Collection
https://developer.apple.com/documentation/swift/collection
以下実装手順になります。
associatedtypeに型を指定
独自クラスをCollectionとして扱うには、associatedtypeとして宣言されている
Element および Index に実際の型を指定する必要があります。
typealias Element = Book
typealias Index = Int
こんな感じですね。
startIndex 及び endIndex を指定
Collectionの開始位置、終了位置を指定する必要があります。
var startIndex: Int { return list.startIndex }
var endIndex: Int { return list.endIndex }
サブスクリプトを定義
array[0]みたいにアクセスするために必要です。
subscript (position: Index) -> Element {
return list[position]
}
index(after:)を定義
func index(after index: Int) -> Index {
return list.index(after: index)
}
サンプルコード
全体でみるとこんな感じになります
import UIKit
class Book {
var title: String?
}
class BookCollection: Collection {
typealias Element = Book
typealias Index = Int
private var list: [Book] = []
var startIndex: Int { return list.startIndex }
var endIndex: Int { return list.endIndex }
subscript (position: Index) -> Element {
return list[position]
}
func index(after index: Int) -> Index {
return list.index(after: index)
}
func append(newElement: Element) {
list.append(newElement)
}
}
var collection = BookCollection()
print(collection.isEmpty ? "empty" : "not empty") // => empty
for i in 0..<10 {
let b = Book()
b.title = "title\(i)"
collection.append(newElement: b)
}
print(collection.count) // => 10
print(collection.isEmpty ? "empty" : "not empty") // => not empty
print(collection.first!.title!) // => title0
collection.forEach { (b) in
// do something
}