2016-08-10 6 views
2
@IBAction func generateBtn(sender: UIButton) { 
    let strt = UInt32(strtNum.text!) 
    let end = UInt32(endNum.text!) 
    let ttlNums = Int(amtNums.text!) 

    let x = RandomNum() 


    var z = 0 

    while z<ttlNums{ 
     let y = x.rndNumGen(strt!, end: end!) 
     z += 1 
     var h = [String]() 
     h.append(String(y)) 
     let display:String = h.joinWithSeparator(", ") 

     winningNums.text = display 
     print (display) 

    }  
} 

このコードで何が問題なのか分かりません。文字列の表示をラベルに入れようとしていて、乱数ジェネレータの最後の数字を出力します。コンソールに印刷すると、すべての乱数が表示されます。すぐにラベルを配列に入れる

+2

(したがって失敗しnilを返すためにUInt32初期化子を引き起こす)ではない文字列が含まれている場合、何が起こるときに何が起こるかに対処するためのコードを追加します 'あなたはいつも新しい空変数 'h'を作成しています。これは意図されていますか? – vadian

答えて

1

ここでの主な問題は、配列がすべてのループ反復で新しく作成され、ラベルがすべてのループ反復で設定されていることです。つまり、配列にはその反復で作成された要素のみが含まれ、その後で新しい配列にリセットされ、新しい要素が追加されます。配列は開始時に一度初期化され、ループ内で繰り返し要素が追加され、最後に一度ラベルに挿入される必要があります。

@IBAction func generateBtn(sender: UIButton) { 
    guard let startText = strtNum.text, let start = UInt32(startText), 
      let endText = endNum.text, let end = UInt32(endText), 
      let ttlText = amtNums.text, let ttlNums = UInt32(ttlText) else { 
       //one of these is nil, handle it gracefully here 
       return 
      } 

    let randomGenerator = RandomNum() 

    var h = [String]() 
    h.reserveCapacity(ttlNums) 
    for _ in 0..<ttlNums { 
     let randomNum = randomGenerator.rndNumGen(start, end: end) 
     h.append(String(RandomNum)) 
    } 

    let display = h.joinWithSeparator(", ") 

    winningNums.text = display 
    print(display) 
} 

私はスウィフトのベストプラクティスや規則に沿って、このコードを持って他のいくつかの変更を加えました:

  1. はアンラップを強制しないでください。 if letまたはguard letバインドを使用して、ゼロ値を安全に処理します。
  2. 変数に意味のある名前を付けます。特定の場合を除いて、一文字の名前は避けてください。
  3. 関数/メソッド名の横にスペースを入れないでください。
  4. 既知の範囲を反復するためにwhileループを使用しないでください。代わりに、for inループを使用してください。
  5. t3xtspkには入力していませんが、それはあなたのおかげで十代の若者が書いたように見えます。オートコンプリートであなたの言葉が終わるので、とにかくタイピングすることはほとんどありません。簡単で読みやすいものにする。

私はあなたがいくつかの変更を自分で作ることをお勧め:

  1. generateBtnの名前を変更します。機能/方法DOは、動作です。それらは動詞、または動詞句で命名されるべきです。おそらくdisplayRandomArrayのようなものを試してみてください。
  2. ランダム配列生成を独自のメソッドにリファクタリングします。
  3. 名前の変更RandomNum。見た目では、数字ではありません。ランダム番号ジェネレーターです。おそらく試してみてくださいRandomNumberGenerator
  4. 名前の変更h
  5. こと.textがnilである、またはそれはUInt32型で
関連する問題