自Swift 1.2起,苹果公司引入了Set
集合类型。
比如说,我有一个集合:
var set = Set<Int>(arrayLiteral: 1, 2, 3, 4, 5)
现在我想从中获取一个随机元素。问题是如何做到?Set
不像Array
那样提供subscript(Int)
,而是提供了subscript(SetIndex<T>)
。但首先,SetIndex<T>
没有可访问的初始化程序(因此,我无法只使用所需的偏移量创建索引),其次即使我可以得到集合中第一个元素的索引(var startIndex = set.startIndex
),那么我唯一能够获得第N个索引的方法是通过连续调用successor()
。因此,目前我只能看到两种选择,都很丑陋和昂贵:
- 将集合转换为数组(
var array = [Int](set)
),然后使用其下标(该下标完美地接受Int
);或者 - 获取集合中第一个元素的索引,遍历
successor()
方法链以获取第N个索引,然后通过集合的下标读取相应的元素。
我错过了其他的方法吗?
advancedBy(_:)
。extension Set { func randomElement() -> Element { let n = Int(arc4random_uniform(UInt32(count))); let i = startIndex.advancedBy(n); return self[i];} }
- griotspeakadvance
已不再可用。将第3行更改为let i = s.startIndex.advancedBy(n)
。 - tebs1200