我正在尝试使自己的类型符合CollectionType
。通过Swift 2.0中引入的协议扩展,现在可以只实现所需实例方法的一个子集,同时自动实现所有其他方法。但是我需要提供的最小方法子集是什么?
答案 0 :(得分:9)
似乎最低要求是实施
Indexable
协议。这是一个例子,没有一个
可以省略属性/方法而不会导致编译器错误:
struct MyCollectionType : CollectionType {
var startIndex : Int { return 0 }
var endIndex : Int { return 3 }
subscript(position : Int) -> String {
return "I am element #\(position)"
}
}
SequenceType
协议默认实现:
let coll = MyCollectionType()
for elem in coll {
print(elem)
}
/*
I am element #0
I am element #1
I am element #2
*/
对于 mutable 集合类型,下标必须是可读/写的:
struct MyCollectionType : MutableCollectionType {
var startIndex : Int { return 0 }
var endIndex : Int { return 3 }
subscript(position : Int) -> String {
get {
return "I am element #\(position)"
}
set(newElement) {
// Do something ...
}
}
}
Swift 3的更新: CollectionType
已重命名为
Collection
,您必须实施一个额外的方法
“移动索引”(比较A New Model for Collections and Indices):
struct MyCollectionType : Collection {
var startIndex : Int { return 0 }
var endIndex : Int { return 3 }
subscript(position : Int) -> String {
return "I am element #\(position)"
}
func index(after i: Int) -> Int {
guard i != endIndex else { fatalError("Cannot increment endIndex") }
return i + 1
}
}