我想获得Set<ShopItemCategory>
中的下一个项目。我以为我可以将当前项的索引作为Int
,然后使用该索引通过向其添加1来获取同一组中的下一个项目(除非它是集合中的最后一项,然后是index将设置为0)。但是,indexOf没有为我返回Int
。它返回类型SetIndex<ShopItemCategory>
。如何以其他更简单的方式返回类型Int
索引,或者一次循环设置1项?
mutating func swapCategory() {
var categoryIndex =
self.allShopItemCategories.indexOf(self.currentShopItemCategory)
if categoryIndex == self.allShopItemCategories.count - 1 {
categoryIndex = 0
} else {
categoryIndex++
}
self.currentShopItemCategory = self.allShopItemCategories[catIndex!]
}
答案 0 :(得分:3)
你做不到。因为Set
中的元素不是有序的。
另一方面,您可以从Set中构建一个数组,并根据需要访问元素。
请看以下示例:
class Foo<T:Hashable> {
private let list: [T]
private var currentIndex = 0
var nextElm : T {
currentIndex = (currentIndex + 1) % list.count
return list[currentIndex]
}
init(set: Set<T>) {
list = Array(set)
}
}
let set : Set = [1,2,3]
let foo = Foo(set: set)
foo.nextElm // 3
foo.nextElm // 2
foo.nextElm // 1
foo.nextElm // 3
foo.nextElm // 2
foo.nextElm // 1
希望这有帮助。
答案 1 :(得分:2)
您可以在集合上调用enumerate()
来获取迭代器,但是实现Set
本身就是无序的。使用迭代器,您可以通过每个元素,但无法保证访问顺序。如果您想要有序集合,请使用数组。
var x = Set<Int>()
x.insert(1)
x.insert(2)
for (index, item) in x.enumerate() {
print("\(item)")
}
// the for loop could print "1,2" or "2,1"...
// there's no way to tell what order the items will be iterated over,
// only that each item *will* be iterated over.