2016-03-25 29 views
0

私はここから配列シャッフル関数を使用しています:http://iosdevelopertips.com/swift-code/swift-shuffle-array-type.html。この行で forループのカウンタを減らすには?

:文の

C-スタイルが廃止され、中に削除されます。

for var index = array.count - 1; index > 0; index -= 1 

コードで

func shuffleArray<T>(arrayparam: Array<T>) -> Array<T> 
{ 
    var array = arrayparam 
    for var index = array.count - 1; index > 0; index -= 1 
    { 
     // Random int from 0 to index-1 
     let j = Int(arc4random_uniform(UInt32(index-1))) 

     // Swap two array elements 
     // Notice '&' required as swap uses 'inout' parameters 
     swap(&array[index], &array[j]) 
    } 
    return array 
} 

スウィフト以下は、この警告をスローします未来 スウィフトのバージョン

ここで何を使用すべきかについての推奨はありません。どのようなアイデアを置き換える必要がありますか?

+0

を言うことができますので、私は間違いなく、インデックスこのライン上== 0は、アプリがクラッシュします{...}' –

+0

)(>>>オペレータに提供します= Int(arc4random_uniform(UInt32(index-1))) – 4thSpace

答えて

2

http://bjmiller.me/post/137624096422/on-c-style-for-loops-removed-from-swift-3

を見てみましょう1だけ減少:より多くのステップによって

for i in (0...n).reverse() { 

} 

または

減少:

for i in someNum.stride(through: 0, by: -2) { 

} 

さらに詳しい情報:のための2つのバージョンがありますがストライド:throughおよびto。差異は、throughの場合は< =と> =、の場合はtoの場合は、必要なものによって異なります。

+0

これは機能していないので、私はOPにすべてのものを投稿しました。 – 4thSpace

+0

本当のコードを投稿して何がうまくいかないか、あるいは私がそれを信じていない限り、 – Wingzero

+0

@ 4thSpace 'Int(arc4random_uniform(UInt32(index-1)))'は常にクラッシュします。 1を減算しないでください。スワップを使う前に 'index!= j'を確認するためにguardステートメントを追加する必要もあります。 –

-2

なぜあなたはしないでください:

for var index = array.count - 1; index > 0; index =index-1 ; 
+1

代わりにアプリが動作せずクラッシュします。 – 4thSpace

1
func shuffle<T>(array: Array<T>) -> Array<T> { 
    var result = array 
    for index in array.indices.reverse() { 
     // generate random swapIndex and add a where clause 
     // to make sure it is not equal to index before swaping 
     guard 
      case let swapIndex = Int(arc4random_uniform(UInt32(array.count - index))) + index 
      where index != swapIndex 
      else { continue } 
     swap(&result[index], &result[swapIndex]) 
    } 
    return result 
} 

var arrInt = Array(1...100) 
shuffle(arrInt) // [28, 19, 25, 53, 35, 60, 14, 62, 34, 15, 81, 50, 59, 40, 89, 30, 2, 54, 27, 9, 82, 21, 11, 67, 84, 75, 44, 97, 66, 83, 36, 20, 26, 1, 76, 77, 8, 13, 72, 65, 64, 80, 88, 29, 98, 37, 33, 70, 52, 93, 100, 31, 4, 95, 45, 49, 61, 71, 24, 16, 12, 99, 94, 86, 46, 69, 63, 22, 48, 58, 51, 18, 43, 87, 41, 6, 92, 10, 38, 23, 68, 85, 42, 32, 55, 78, 56, 79, 3, 47, 39, 57, 90, 17, 5, 73, 7, 91, 74, 96] 
0
for var index = array.count - 1; index > 0; index -= 1 

は逆の範囲を使用してください。範囲を形成し、それを逆:

for index in (1..<array.count).reverse 

しかし、私の答えhereで説明したように、よりよい方法があります。聞かせてJ:あなたはarray.indices.reverseで、インデックスのために `

for index in array.count>>>1