Blog

For-In & Value Type in Swift

April 30, 2015

For-In & Value Type in Swift

간단히 For-In 문법부터 살펴보면 다음과 같다.

for item in thing {
}

thing 부분에는 숫자의 범위나 배열, 문자열 등이 올 수 있다. 다시 말해서, SequenceType 프로토콜을 따르는 타입에 대해서 각각의 값을 item에 가져와서 반복하게 된다.

for x in [1, 2, 3, 4, 5] {
    println(x)
    x = 0 // error: cannot assign to 'let' value 'x'
}

위의 코드처럼 For-In 에서 사용되는 item은 상수(let)으로 동작한다. 따라서, For-In 안에서 값을 변경할 수 없다.

struct Point {
    var x = 0.0, y = 0.0
}

var points = [Point(x: 0, y: 0), Point(x: 1, y: 1), Point(x: 2, y: 2)]

for point in points {
    point.x = 0 // error: cannot assign to 'x' in 'point'
}

구조체(struct)의 배열로 For-In을 돌리면 어떻게 될까? 구조체는 클래스와 다르게 값 타입(Value Type)이기 때문에 역시나 상수(let)로 동작해서 구조체의 속성을 바꿀 수 없다.

어제 스터디를 하다가 구조체로 모델을 만든 프로그램에서 왜 에러가 나는지 살펴보다가 For-In, struct, let에 대해서 다시 한 번 생각하게 되었다. 덧붙이면 For-In 뿐만 아니라, 구조체를 옵셔널 타입으로 다루게 되면 if let으로 옵셔널 풀기(unwrapping)를 할 때도 값 타입이기 때문에 구조체의 속성에 대해 변경을 할 수 없게 된다.