在Swift Set中获取下一个项目

时间:2015-09-13 00:37:01

标签: swift set

我想获得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!]

}

2 个答案:

答案 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.