如何将下面的函数转换为 swift 3
?当前出现 二元运算符 '..<' 无法应用于 'Int' 和 'Self.IndexDistance' 类型的操作数
错误。
extension MutableCollection where Index == Int {
/// Shuffle the elements of `self` in-place.
mutating func shuffleInPlace() {
// empty and single-element collections don't shuffle
if count < 2 { return }
for i in 0..<count - 1 { //error takes place here
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
引用:https://stackoverflow.com/a/24029847/5222077
count
返回一个 IndexDistance
这是描述的类型
两个集合索引之间的距离。 IndexDistance
是
必须是 SignedInteger
,但不必是 Int
并且可以
不同于 Index
。因此无法创建
范围 0..
一种解决方案是使用 startIndex
和 endIndex
代替 0
和 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])
}
}
}
}
另一个优点是这也适用于数组 slices (其中第一个元素的索引不一定为零)。
注意,根据新的 "Swift API Design Guidelines" ,
shuffle()
是变异 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 3 版本已添加到 同时How do I shuffle an array in Swift?。
对于 Swift 4 (Xcode 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)
}
}
}
有关 swapAt
的更多信息,请参阅 SE-0173 Add MutableCollection.swapAt(_:_
。
从 Swift 4.2(Xcode 10,目前处于测试阶段)开始,实现了
SE-0202 Random Unification ,
shuffle()
和 shuffled()
是 Swift 标准库的一部分。
关于swift - 随机播放数组 swift 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615614/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) | Powered by Discuz! X3.4 |