gpt4 book ai didi

arrays - 如何 swift 将调用委托(delegate)给 [0..
转载 作者:搜寻专家 更新时间:2023-10-31 08:21:27 26 4
gpt4 key购买 nike

背景

为了方便起见,我使用了这个别名:

typealias Deck = [Int]

我的需求不断扩大,所以我现在将我的代码转换为:

class Deck
{
var deck : [Int]
// ... other members
}

我可以将我的大部分调用委托(delegate)给 self.deck,但是在谷歌搜索了一下之后,我仍然无法弄清楚如何委托(delegate)这个调用:

let deck = Deck()
for i in deck[0..<5] { } // <--- PROBLEMS HERE

问题

如何实现此调用的委托(delegate)?

我认为它与 subscriptrange(或者可能是 sequence?)有关,但我没有用谷歌搜索交叉点这两个主题。

最佳答案

对于 deck[0..<5]你需要实现 Sliceable协议(protocol),这反过来需要 CollectionTypeSequenceType .

以下示例实现了 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用作数组元素的类型或键入数组索引。

您也可以将所有代码放入类定义中。我选择了分开扩展以明确哪种协议(protocol)需要哪种方法。

关于arrays - 如何 swift 将调用委托(delegate)给 [0..<n]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27374475/

26 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com