티스토리 뷰

Tech/Swift

스위프트 mutating 키워드

Ellie Kim 2020. 11. 12. 00:41

스위프트에서 클래스는 레퍼런스 타입이고 구조체와 열거형은 값 타입입니다.

값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없습니다.

값 타입의 속성을 수정하려면 인스턴스 메서드에서 mutating 키워드를 사용해야 합니다.

 

mutating을 붙이면 self 프로퍼티에 새로운 인스턴스를 할당할 수 있습니다.

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

 

mutating moveBy(x:y:)메소드는 x, y값이 타겟 위치로 설정된 새 구조체를 만듭니다.

 

또 다른 예제

enum TriStateSwitch {
    case off, low, high
    mutating func next() {
        switch self {
        case .off:
            self = .low
        case .low:
            self = .high
        case .high:
            self = .off
        }
    }
}
var ovenLight = TriStateSwitch.low
ovenLight.next()
// ovenLight is now equal to .high
ovenLight.next()

이 예제에서는 열거형의 3개 상태 스위치를 보여줍니다.

next()가 호출되면 3가지 다른 상태(off. low, high) 사이를 순환하게 됩니다.

 

스위프트로 스택을 구현한 구조체를 살펴봅시다.

구조체로 구현했기 때문에 값 타입입니다.

그러므로 push와 pop에 mutating키워드가 붙어야만 값 타입 프로퍼티를 수정할 수 있습니다. 

struct Stack {
    var stack = [Int]()
    
    mutating func push(_ item: Int) {
        stack.append(item)
    }
    
    mutating func pop() -> Int? {
        if !stack.isEmpty {
           return stack.removeLast()
        }
        return nil
    }
}

var stack = Stack()
stack.push(1)
stack.push(2)
// stack : [1, 2]
stack.pop()
// stack : [1]

 

* 만약 mutating 키워드를 붙이지 않는다면 아래와 같이 에러가 발생합니다.

 

resource: docs.swift.org/swift-book/LanguageGuide/Methods.html

'Tech > Swift' 카테고리의 다른 글

스위프트 Combination  (0) 2021.07.02
스위프트 Intersperse함수  (0) 2021.05.30
스위프트 배열 크기  (0) 2020.11.09
스위프트 오버플로우 연산  (0) 2020.09.20
스위프트 비트 연산자  (0) 2020.09.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함