背景
为了方便起见,我使用了这个别名:
typealias Deck = [Int]
我的需求在扩大,因此现在我已将代码转换为:
class Deck
{
var deck : [Int]
// ... other members
}
我可以通过委派我的大部分电话self.deck
,但是在进行了一些搜索之后,我仍然很难弄清楚如何委派此电话:
let deck = Deck()
for i in deck[0..<5] { } // <--- PROBLEMS HERE
问题
如何实现此电话的委托?
我认为这与subscript
和range
(或者也许是sequence
?)有关,但是我没有运气去搜索这两个主题的交集。
因为deck[0..<5]
您需要实现Sliceable
协议,而协议又需要CollectionType
和SequenceType
。
以下示例实现MutableCollectionType
了将设置元素也转发到数组的方法:
class Deck
{
typealias DeckValueType = Int
typealias DeckIndexType = Array<DeckValueType>.Index
var deck : [DeckValueType] = [0, 1, 2, 3, 4, 5, 6] // just for demonstration ...
}
extension Deck : SequenceType {
func generate() -> IndexingGenerator<[DeckValueType]> {
return deck.generate()
}
}
extension Deck: MutableCollectionType {
var startIndex : DeckIndexType { return deck.startIndex }
var endIndex : DeckIndexType { return deck.endIndex }
subscript(index: DeckIndexType) -> DeckValueType {
get {
return deck[index]
}
set(newValue) {
deck[index] = newValue
}
}
}
extension Deck : Sliceable {
subscript (bounds: Range<DeckIndexType>) -> ArraySlice<DeckValueType> {
get {
return deck[bounds]
}
}
}
然后工作:
let deck = Deck()
for i in deck[0..<5] {
println(i)
}
类型别名不是严格必需的,但是它们使区分Int
是用作数组元素的类型还是用作数组索引的类型变得更加容易。
您也可以将所有代码放入类定义中。我选择了单独的扩展名以明确说明哪种协议需要哪种方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句