Bu yanıt, Swift 4.2 ve sonraki sürümlerinde hızlı ve tekdüze bir algoritma (Fisher-Yates) ile nasıl karıştırılacağını ve Swift'in önceki çeşitli sürümlerinde aynı özelliğin nasıl ekleneceğini detaylandırıyor. Her Swift sürümünün adlandırma ve davranışı, söz konusu sürüm için mutasyona uğrayan ve değiştirmeyen sıralama yöntemleriyle eşleşir.
Hızlı 4.2+
shuffle
ve shuffled
Swift 4.2'den başlayan yereldir. Örnek kullanım:
let x = [1, 2, 3].shuffled()
// x == [2, 3, 1]
let fiveStrings = stride(from: 0, through: 100, by: 5).map(String.init).shuffled()
// fiveStrings == ["20", "45", "70", "30", ...]
var numbers = [1, 2, 3, 4]
numbers.shuffle()
// numbers == [3, 2, 1, 4]
Swift 4.0 ve 4.1
Bu uzantılar shuffle()
herhangi bir değişken koleksiyona bir yöntem (diziler ve güvenli olmayan değiştirilebilir tamponlar) ve shuffled()
herhangi bir diziye bir yöntem ekler :
extension MutableCollection {
/// Shuffles the contents of this collection.
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
// Change `Int` in the next line to `IndexDistance` in < Swift 4.1
let d: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
let i = index(firstUnshuffled, offsetBy: d)
swapAt(firstUnshuffled, i)
}
}
}
extension Sequence {
/// Returns an array with the contents of this sequence, shuffled.
func shuffled() -> [Element] {
var result = Array(self)
result.shuffle()
return result
}
}
Yukarıdaki Swift 4.2 örnekleriyle aynı kullanım.
Hızlı 3
Bu uzantılar shuffle()
herhangi bir değiştirilebilir koleksiyona bir shuffled()
yöntem ve herhangi bir diziye bir yöntem ekler :
extension MutableCollection where Indices.Iterator.Element == Index {
/// Shuffles the contents of this collection.
mutating func shuffle() {
let c = count
guard c > 1 else { return }
for (firstUnshuffled , unshuffledCount) in zip(indices, stride(from: c, to: 1, by: -1)) {
// Change `Int` in the next line to `IndexDistance` in < Swift 3.2
let d: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount)))
guard d != 0 else { continue }
let i = index(firstUnshuffled, offsetBy: d)
self.swapAt(firstUnshuffled, i)
}
}
}
extension Sequence {
/// Returns an array with the contents of this sequence, shuffled.
func shuffled() -> [Iterator.Element] {
var result = Array(self)
result.shuffle()
return result
}
}
Yukarıdaki Swift 4.2 örnekleriyle aynı kullanım.
Hızlı 2
(eski dil: Temmuz 2.20'de iTunes Connect'te yayınlamak için Swift 2.x'i kullanamazsınız)
extension MutableCollectionType 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 startIndex ..< endIndex - 1 {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
guard i != j else { continue }
swap(&self[i], &self[j])
}
}
}
extension CollectionType {
/// Return a copy of `self` with its elements shuffled.
func shuffle() -> [Generator.Element] {
var list = Array(self)
list.shuffleInPlace()
return list
}
}
Kullanımı:
[1, 2, 3].shuffle()
// [2, 3, 1]
let fiveStrings = 0.stride(through: 100, by: 5).map(String.init).shuffle()
// ["20", "45", "70", "30", ...]
var numbers = [1, 2, 3, 4]
numbers.shuffleInPlace()
// [3, 2, 1, 4]
Hızlı 1.2
(eski dil: Temmuz 2018'den itibaren iTunes Connect'te yayınlamak için Swift 1.x'i kullanamazsınız)
shuffle
bir mutasyon dizisi yöntemi olarak
Bu uzantı, değiştirilebilir bir Array
örneği yerinde karıştırmanıza olanak tanır :
extension Array {
mutating func shuffle() {
if count < 2 { return }
for i in 0..<(count - 1) {
let j = Int(arc4random_uniform(UInt32(count - i))) + i
swap(&self[i], &self[j])
}
}
}
var numbers = [1, 2, 3, 4, 5, 6, 7, 8]
numbers.shuffle() // e.g., numbers == [6, 1, 8, 3, 2, 4, 7, 5]
shuffled
değişmeyen dizi yöntemi olarak
Bu uzantı, bir Array
örneğin karıştırılmış bir kopyasını almanıza olanak tanır :
extension Array {
func shuffled() -> [T] {
if count < 2 { return self }
var list = self
for i in 0..<(list.count - 1) {
let j = Int(arc4random_uniform(UInt32(list.count - i))) + i
swap(&list[i], &list[j])
}
return list
}
}
let numbers = [1, 2, 3, 4, 5, 6, 7, 8]
let mixedup = numbers.shuffled() // e.g., mixedup == [6, 1, 8, 3, 2, 4, 7, 5]