Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

swift - Can't form Range with end < start Check range before doing for loop?

I'm encountering a change in the swift code which i do not quite understand.

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

I have a program that gets an result array which can also be empty. This is no problem with the for loop above. Now apple wants me to change the code into the following. But this will crash if the array is empty.

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

Do I really have to check the range first before i do a loop like?

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

Is there a smarter solution?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If you just want to iterate over a collection, then use the for <element> in <collection> syntax.

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

If you also need access to the index of the element at each iteration, you can use enumerate(). Because indices are zero based, the index will have the range 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
}

You can always add one to the index at each iteration in order to access the position (to get a range of 1..<arr.count+1).

If none of these solve your problem, then you can use the range 0..<arr.count to iterate over the indices of your array, or as @vacawama says, you could use the range 1..<arr.count+1 to iterate over the positions.

for index in 0..<arr.count {

    // do something with index
}

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

    // do something with position
}

0..<0 cannot crash for an empty array as 0..<0 is just an empty range, and 1..<arr.count+1 cannot crash for an empty array as 1..<1 is also an empty range.

Also see @vacawama's comment below about using stride for safely doing more custom ranges. For example (Swift 2 syntax):

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

Swift 3 syntax:

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

This is where startIndex is the number to start the range at, arr.count is the number that the range will stay below, and 1 is the stride length. If your array has less elements than the given starting index, then the loop will never be entered.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...