2016-05-10 2 views
5

私はかなり理解していない迅速なコードの変更に遭遇しています。end <startで範囲を形成できませんforループを実行する前に範囲を確認しますか?

var arr = [] 
for var i = 1; i <= arr.count; i += 1 
{ 
    print("i want to see the i \(i)") 
} 

私は空でもよい結果配列を取得するプログラムを持っています。これは上記のforループでは問題ありません。 Appleはコードを次のように変更したいと考えています。しかし、配列が空の場合、これはクラッシュします。

var arr = [] 
for i in 1...arr.count 
{ 
    print("i want to see the i \(i)") 
} 

ループを実行する前に、範囲を最初に確認する必要がありますか?

var arr = [] 
if (arr.count >= 1){ 
    for i in 1...arr.count 
    { 
     print("I want to see the i \(i)") 
    } 
} 

もっとスマートな解決策がありますか?

+7

を読ん

var arr = [] for i in arr.indices { print("I want to see the i \(i)") // 0 ... count - 1 print("I want to see the i \(i + 1)") // 1 ... count } 

が、慎重に、きっとあなたは '0 .. Hamish

+2

...と使用すると、' 0 .. <0'は空の範囲なので、ループ本体が入力されないので問題は解決します。 – vacawama

+3

...それは基本的にSwiftマニュアルの2ページ目です:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097 -CH6-ID60 – Eiko

答えて

11

コレクション全体を繰り返し処理する場合は、for <element> in <collection>構文を使用します。

for element in arr { 
    // do something with element 
} 

あなたはまた、あなたがenumerate()を使用することができ、各反復で要素のインデックスにアクセスする必要がある場合。インデックスはゼロベースなので、インデックスの範囲は0..<arr.countです。

for (index, element) in arr.enumerate() { 

    // do something with index & element 

    // if you need the position of the element (1st, 2nd 3rd etc), then do index+1 
    let position = index+1 
} 

あなたはいつも(1..<arr.count+1の範囲を取得するための)位置にアクセスするために、各反復でインデックスに1を追加することができます。

これらのどれもあなたの問題を解決しない場合は、あなたの配列のインデックスを反復処理する範囲0..<arr.countを使用することができ、または@vacawama saysとして、あなたはポジションを反復する範囲1..<arr.count+1を使用することができます。

for index in 0..<arr.count { 

    // do something with index 
} 

for position in 1..<arr.count+1 { 

    // do something with position 
} 

0..<00..<0がちょうど空範囲であり、そして1..<1も空の範囲であるよう1..<arr.count+1が空の配列のためにクラッシュすることができないように空の配列のためにクラッシュすることができません。

@vacawama's comment belowも参照してください。strideを安全に使用してより多くのカスタム範囲を作成できます。例えば(スイフト2構文):

let startIndex = 4 
for i in startIndex.stride(to: arr.count, by: 1) { 
    // i = 4, 5, 6, 7 .. arr.count-1 
} 

スウィフト3構文:startIndexは、AT範囲を開始する数である

for i in stride(from: 4, to: arr.count, by: 1) { 
    // i = 4, 5, 6, 7 .. arr.count-1 
} 

これは、arr.countは、範囲は以下滞在する数であります1がストライド長です。配列の要素が指定された開始インデックスより少ない場合、ループは決して入力されません。

+2

最後に、あなたの開始値が5だったならば、 'for var i = 5 ; i <= arr.count; i + = 1'の場合、 'stride'はあなたの答えです:' forststride(for:arr.count、by:1) '。 – vacawama

+0

@vacawamaはい、安全なカスタム範囲を行うもう一つのきちんとした方法。私はそれを私の答えに含めました:) – Hamish

+0

'stride(through:by:)'は実際に 'through'値を含みます。下にとどまるには 'stride(to:by:)'を使います。 – vacawama

1

これはエラーなしで、あなたの最初の例と同じ結果を生成しなければならない...

var arr = [] 
var i=1 
for _ in arr 
{ 
    print("i want to see the i \(i)") 
    i += 1 
} 

...それはちょうど、配列内の要素をカウントする複雑な方法(arr.count)のように思えるが、私は目に見える以上にこの疑問があると思う。

関連する問題