Swift 값, 참조 타입

참조(Reference) 타입: 클래스, 함수(객체), 클로저
나머지 모두 값(Value) 타입

구조체는 값 타입이기 때문에 구조체 메소드 내에서 프로퍼티를 수정할 수 없음
메소드 내에서 프로퍼티 수정하려면 mutating 키워드 사용

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}

var somePoint = Point(x: 1.0, y: 1.0)
withUnsafePointer(to: &somePoint) { (p) in
    print(p)    //0x00007ffeeb538570
}

somePoint.moveBy(x: 2.0, y: 3.0)
withUnsafePointer(to: &somePoint) { (p) in
    print(p)    //0x00007ffeeb538570
}

//혹시나 해서 주소값을 찍어 봤는데 주소값이 바뀌진 않는군요!


값 타입의 변수를 함수 파라미터로 넘길 때 참조로 넘길 수 있는 키워드, inout

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)

//엄청난 크기의 Array(값타입)를 함수 파라미터로 넘길 때 참조로 넘겨서 복사를 방지함
func calcSomething(_ array: inout [Int]) {
    array.remove(at: 10)
}
var array = [Int]()
for i in 0 ..< 10000000 {
    array.append(i)
}
calcSomething(&array)

The Swift Programming Language (Swift 5.1) 참조했습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다