2016-03-28 23 views
3

私はnba抽選をシミュレートするアプリを書いています。私は既にランダムな組み合わせを生成するためのコードを書いて、各チームに割り当てました。ios-スレッド1 exc_bad_instructionのエラー

ここでは、図面をシミュレートし、各チームにドラフトポジションを割り当てる私の方法です。 standingsArrayは、各チームの名前、シード、勝利、損失、草案位置の値を持つObjectWrapper型のチームアイテムの配列です。だから基本的には、私は14のボールを持っていて、ランダムに4つのボールを選ぶという組み合わせです(順序は関係ありません)。したがって、基本的に合計1001個の組み合わせが可能ですが、1つは取り除かれます。 (スローされた組み合わせが選択されないように、最初のwhileループを無視することができます)。記録に基づいて14の宝くじチームに多くの組み合わせが割り当てられます(最悪のチームの場合は250、2番目の最悪の場合は199)。私のメソッドstandingsArrayの引数には、すでに各チームに割り当てられている可能性の数があります。次に、無作為に4つのボールを合計可能性から引き出し、その組み合わせを持つチームが最初の選択を取得します。しかし、そのチームのすべての組み合わせが選択されていないので、それらの組み合わせをすべて削除する必要がありますが、それは非常に複雑なので、tempPossibilitiesという新しい配列を作成して、すべての組み合わせをすべてのチームに追加します今選択したものを除いて、新しい組み合わせを生成して選択することができます。

ただし、私はこの行にエラーが発生していますfor j in 0...(standingsArray[i].possibilities?.count)!-1{これは、不正な命令エラーを示しています。なぜこのエラーが発生するのかわかりません。そして、それ以外の何かが意味をなしているのは、forループでエラーが発生したにもかかわらずforループとtempPossibilities配列が適切な量の組み合わせ(宝くじチームなし)で完全に埋められているということです。ありがとう、任意のヘルプは高く評価され、そして本当に長い段落

func setDraftPositions(var standingsArray: [Team])->[Team]{ 
    var lottery: [Team]=[] 
    var totalPossibilities: [[Int]]=combosOfLength(14, m: 4) 
    var tempPossibilities = [] 
    var rand = Int(arc4random_uniform(UInt32(totalPossibilities.count))) 
    var draw = totalPossibilities[rand] 
    while (draw==(unused?.first)!) { 
     rand = Int(arc4random_uniform(UInt32(totalPossibilities.count))) 
     draw = totalPossibilities[rand] 
    } 

    s: for x in 0...13{ 
     for a in 0...(standingsArray[x].possibilities?.count)!-1{ 
     if(draw==standingsArray[x].possibilities![a]){ 
      standingsArray[x].setDraftingPosition(1) 
      standingsArray[x].isLottery=true; 
      lottery.append(standingsArray[x]) 
      for i in 0...(standingsArray.count-1) { 
       if(standingsArray[i].firstName != standingsArray[x].firstName!) { 
        for j in 0... (standingsArray[i].possibilities?.count)!-1{ //ERROR is happening here 
         tempPossibilities.append(standingsArray[i].possibilities![j]) 
        } 
       } 
      } 
      standingsArray.removeAtIndex(x) 
      break s; 
     } 
     } 

    } 

(次の2つのピックのためにこれを繰り返す)

+0

これを試してくださいvar someValue = standingsArray [x] .possibilities?count! - 1'とし、その値をループのように 'for a 0 ... someValue'のように追加します。この問題でちょっとランダムに撮影してみてください。これで問題が解決したら教えてください。 – Fennec

+0

私はこれを行うと、オプションの型intをアンラップすることができず、感嘆符を削除して(standingsArray [x] .possibilities?count)! - 1に置き換えます。次に、someValueが定義されている行には不正な命令エラーが与えられているので、その作業は行われません。 –

+0

問題はおそらくアンラップです。ループ内に値を追加する前に、値をどこかにアンラップできるかどうかをコードにチェックしてください。 'print((standingsArray [x] .possibilities?count)!)'の値を出力してみてください。 – Fennec

答えて

0

して申し訳ありませんが、これを試してみてください: コードは以下の通りです

for j in 0...(standingsArray[i].possibilities?.count)!-1{ 

for j in 0...(standingsArray[i].possibilities?.count)! - 1{ 

適切な間隔が必要です。

+0

それでも、私の推測では、オプションの値をアンラップすることと関係がありますが、そのことは分かりません –

関連する問題