随机排列swift 3

随机排列swift 3,第1张

随机排列swift 3

count
返回,
IndexDistance
它是描述两个集合索引之间距离的类型。
IndexDistance
必须为
SignedInteger
,但不必为
Int
,可以与有所不同
Index
。因此,不可能创建范围
0..<count- 1

一个解决方案是使用

startIndex
endIndex
代替
0
and
count

extension MutableCollection where Index == Int {    /// Shuffle the elements of `self` in-place.    mutating func shuffle() {        // empty and single-element collections don't shuffle        if count < 2 { return }        for i in startIndex ..< endIndex - 1 { let j = Int(arc4random_uniform(UInt32(endIndex - i))) + i if i != j {     swap(&self[i], &self[j]) }        }    }}

另一个优点是,它也可以与数组 切片 正确配合使用 (第一个元素的索引不一定为零)。

请注意,根据新的“ Swift API设计指南”,它

shuffle()
变异随机播放方法
shuffled()
返回数组的非变异对应方法的“适当”名称:

extension Collection {    /// Return a copy of `self` with its elements shuffled    func shuffled() -> [Iterator.Element] {        var list = Array(self)        list.shuffle()        return list    }}

_更新:_我已经在Swift中添加了一个(甚至更通用的)Swift 3版本


对于 Swift 4(Xpre 9) ,必须用对集合方法的

swap()

调用来代替对函数的调用
swapAt()
。同样,
Index
不再需要对类型的限制:

extension MutableCollection {    /// Shuffle the elements of `self` in-place.    mutating func shuffle() {        for i in indices.dropLast() { let diff = distance(from: i, to: endIndex) let j = index(i, offsetBy: numericCast(arc4random_uniform(numericCast(diff)))) swapAt(i, j)        }    }}

有关的更多信息,请参见SE-0173

MutableCollection.swapAt(_:_:)
swapAt


Swift 4.2 (Xpre 10,当前处于beta版)开始,具有 SE-0202 Random
Unification的实现

shuffle()
并且
shuffled()
是Swift标准库的一部分。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4927740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存