2017-12-24 3 views
0

저는 Swift를 처음 사용하고 Range를 사용하여 반복을 통해 컬렉션을 수정하면 어떻게 될지 탐험하고 있습니다. 이 두 개의 루프는 다른 동작을 왜 나는 알아낼 수 없습니다 :범위를 반복하면서 스위프트 배열을 수정하는 중 - 0을 계산할 때와 startIndex를 endIndex로 비교하는 경우

var things = ["a", "b", "c"] 
for i in 0..<things.count { 
    print("i: \(i) count: \(things.count) value: \(things[i])") 
    if i == 1 { 
     things.append("x") 
    } 
} 
// i: 0 count: 3 value: a 
// i: 1 count: 3 value: b 
// i: 2 count: 4 value: c 

대 나는 문자 그대로의 범위는 배열의 속성을 액세스 할 때 볼 수 있도록

var things = ["a", "b", "c"] 
for i in things.startIndex...things.endIndex { 
    print("i: \(i) count: \(things.count) value: \(things[i])") 
    if i == 1 { 
     things.append("x") 
    } 
} 
// i: 0 count: 3 value: a 
// i: 1 count: 3 value: b 
// i: 2 count: 4 value: c 
// i: 3 count: 4 value: x 

나는이 Array 클래스 확장을 만들어 :

를 나는 정상적인 사람 대신 이러한 속성을 사용하는 경우
extension Array { 
    var myCount: Int { 
     print("myCount (\(self.count))") 
     return self.count 
    } 
    var myStartIndex: Int { 
     print("myStartIndex (\(self.startIndex))") 
     return self.startIndex 
    } 
    var myEndIndex: Int { 
     print("myEndIndex (\(self.endIndex))") 
     return self.endIndex 
    } 
} 

, 내가 얻을 :

,682,911,921,996 33,210

myStartIndex (0) 
myEndIndex (3) 
i: 0 count: 3 value: a 
i: 1 count: 3 value: b 
i: 2 count: 4 value: c 
i: 3 count: 4 value: x 
이 마법 같은 느낌 때문에 내가 모르는 뭔가가 있어야합니다

! endIndex이 재평가되고있는 것 같으나 count은 아닙니다. 뭐라 구요? 코드의 첫 부분에서 사용한 때문에

+0

나는 물건에있어 for.indices {'또는 물건에있는 물건에 대한 색인이 필요하지 않다면 { –

답변

1

이 인 반 개방 범위 연산자 코드의 두 번째 부분에 사용자가 정상 범위 연산자 (...)를 사용하는 동안 (..<). 다른입니다. apple docs에서 :

반 개방 범위 연산자 (a..<b)는 A에서 B로 실행되는 범위를 정의하지만, B에 포함되지 않습니다. i은 0, 1 인 경우에만 루프 반 열림 범위 연산자 사용 - things.count는 범위 (4 0)로 4 인 경우

그래서, 코드의 첫 번째 부분의 for 루프는 계속되지 않는다 2 또는 3입니다.

..< 대신 ...을 사용하면 첫 번째 코드 결과는 두 번째 코드 결과와 동일합니다.

+0

내 머리를 치게 해줘서 고마워 .- 단순한 실수 야! 변화하는 콜렉션을 반복하는 유일한 방법은 루프를 통해 매번 조건을 평가하기 때문에 'while' 루프를 사용하는 것입니다. Swift의 루프는 한 번만 평가됩니다. (나는 이것이 좋은 생각이라고 말하는 것이 아니다.) - 단지 언어를 배우려고 노력하는 것) – jibberia

관련 문제