Shuffle tableau swift 3
Comment puis-je convertir la fonction ci-dessous pour swift 3
? Actuellement, l'obtention d'un Binary operator '..<' cannot be applied to operands of type 'Int' and 'Self.IndexDistance'
erreur.
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])
}
}
}
référence: https://stackoverflow.com/a/24029847/5222077
- stackoverflow.com/a/27261991/2303865
- Double Possible de Comment puis-je shuffle un tableau dans Swift?
- La question est obsolète, que la référence a été mis à jour pour Swift 3.
Vous devez vous connecter pour publier un commentaire.
count
retourne unIndexDistance
qui est le type décrivantla distance entre deux de collecte d'indices.
IndexDistance
estrequises pour être un
SignedInteger
, mais n'ont pas besoin d'être unInt
et peutêtre différent de
Index
. Par conséquent, il n'est pas possible de créerla gamme
0..<count - 1
.Une solution est d'utiliser
startIndex
etendIndex
au lieu de0
etcount
:Un autre avantage est que cela fonctionne aussi correctement avec le tableau tranches
(où l'indice du premier élément n'est pas nécessairement égale à zéro).
Note que, selon le nouveau "Swift API lignes Directrices de Conception",
shuffle()
est le "bon" nom d'une mutation aléatoire de la méthode,et
shuffled()
pour la non-mutation homologue qui retourne un tableau:Mise à jour: Un (encore plus général) de Swift, la version 3 a été ajouté à
Comment puis-je shuffle un tableau dans Swift? dans l'intervalle.
Pour Swift 4 (Xcode 9) on doit remplacer l'appel à la
swap()
fonction par un appel à la
swapAt()
méthode de la collection.Aussi la restriction sur le
Index
type n'est plus nécessaire:Voir SE-0173 Ajouter
MutableCollection.échangerau(_:_:)
pour plus d'informations surswapAt
.De Swift 4.2 (Xcode 10, actuellement en version bêta), avec la mise en œuvre de
SE-0202 Aléatoire Unification,
shuffle()
etshuffled()
font partie de la Swift de la bibliothèque standard.+ i
danslet j
devrait probablement être+ startIndex
à la place. Le reste c'est très probablement le résultat de l'indice hors limites.i
est dans la gammestartIndex..<endIndex-1
, et un nombre aléatoire dans une plage de0..<endIndex-i
est ajouté ài
, de sorte quej >= i >= startIndex
etj < i + (endIndex-i) = endIndex
.endIndex-1
et pasendIndex-i
. 🙂i == endIndex-1
puisj == i
serait le seul indice possible de permuter avec, par conséquent, il suffit sii
s'exécute jusqu'àendIndex-2
Il y a un shuffle de fisher-yates dans Gamekit:
Vous pouvez également transmettre et de stocker une valeur aléatoire, de sorte que vous obtenez de la même séquence pseudo-aléatoire shuffle valeurs à chaque fois que vous offre la même graine dans le cas où vous avez besoin de recréer une simulation.
Je suggère simplement de brassage des tableaux au lieu d'essayer de l'étendre à des collections en général:
Vous pouvez utiliser le NSArray Extension de GameplayKit cadre de cette: