यह उत्तर ब्योरा देता है कि स्विफ्ट 4.2+ में एक तेज और समान एल्गोरिथ्म (फिशर-येट्स) के साथ फेरबदल कैसे करें और स्विफ्ट के विभिन्न पिछले संस्करणों में समान सुविधा कैसे जोड़ें। प्रत्येक स्विफ्ट संस्करण के लिए नामकरण और व्यवहार उस संस्करण के लिए परिवर्तनशील और गैर-सॉर्टिंग सॉर्टिंग विधियों से मेल खाता है।
स्विफ्ट 4.2+
shuffle
और shuffled
स्विफ्ट 4.2 के मूल निवासी हैं। उदाहरण का उपयोग:
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]
स्विफ्ट 4.0 और 4.1
ये एक्सटेंशन shuffle()
किसी भी परिवर्तनशील संग्रह (सरणियों और असुरक्षित उत्परिवर्ती बफ़र्स) और shuffled()
किसी भी क्रम के लिए एक विधि जोड़ते हैं :
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
}
}
ऊपर दिए गए 4.2 उदाहरणों के समान उपयोग।
स्विफ्ट 3
ये एक्सटेंशन shuffle()
किसी भी परस्पर संग्रह shuffled()
करने की विधि और किसी भी क्रम के लिए एक विधि जोड़ते हैं :
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
}
}
ऊपर दिए गए 4.2 उदाहरणों के समान उपयोग।
स्विफ्ट 2
(अप्रचलित भाषा: जुलाई 2018 से शुरू होने वाले आईट्यून्स कनेक्ट पर प्रकाशित करने के लिए आप स्विफ्ट 2.x का उपयोग नहीं कर सकते हैं)
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
}
}
उपयोग:
[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]
स्विफ्ट 1.2
(अप्रचलित भाषा: आप जुलाई 2018 से शुरू होने वाले iTunes कनेक्ट पर प्रकाशित करने के लिए स्विफ्ट 1.x का उपयोग नहीं कर सकते हैं)
shuffle
एक परिवर्तनशील सरणी विधि के रूप में
यह एक्सटेंशन आपको Array
जगह में एक परिवर्तनशील उदाहरण को फेरबदल करने देगा :
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
गैर-उत्परिवर्तन सरणी विधि के रूप में
यह एक्सटेंशन आपको एक Array
उदाहरण की एक फेरबदल प्रति प्राप्त करने देगा :
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]