VesselWheel

구조체(Struct)의 mutating 키워드에 대해서 설명해주세요. 본문

Grammary in Swift

구조체(Struct)의 mutating 키워드에 대해서 설명해주세요.

JasonYang 2024. 3. 15. 10:01

https://skytitan.tistory.com/551

 

[Swift] 왜 struct에선 mutating을 사용해야하는가?

How is struct(immutability) related to thread safety? Posted in r/swift by u/vingrish • 1 point and 14 comments www.reddit.com Swift and mutating struct There is something that I don't entirely understand when it comes to mutating value types in Swift. A

skytitan.tistory.com

 

https://youtu.be/8T5vQnMspko

If a struct has a variable property but the instance of the struct was created as a constant, that property can’t be changed – the struct is constant, so all its properties are also constant regardless of how they were created.

The problem is that when you create the struct Swift has no idea whether you will use it with constants or variables, so by default it takes the safe approach: Swift won’t let you write methods that change properties unless you specifically request it.

When you want to change a property inside a method, you need to mark it using the mutating keyword, like this:

struct Person {
    var name: String

    mutating func makeAnonymous() {
        name = "Anonymous"
    }
}

Because it changes the property, Swift will only allow that method to be called on Person instances that are variables:

var person = Person(name: "Ed")
person.makeAnonymous()

 

 


Mutate 변경가능하다. 

Struct 구조체에서 프로퍼티는 값을 할당하고나면 값이 정해져 있다. var 든 let이든 처음 값은 있으니까,

그렇기에 구조체를 변경가능하게 사용하기 위해 정의한다. 

  • struct는 mutable, immutable 2가지 모드를 가지고 있다고 가정할 수 있다.
    • let으로 할당하면 immutable, var로 할당하면 mutable이다.
    • 추가로, class는 '참조 가능한' entity를 표현하기 때문에 이러한 설정의 개념이 없고 항상 mutable하다.
  • struct는 plain, mutating 이렇게 2가지 종류의 method를 가진다고 할 수 있다.
    • plain메서드는 immutable하다는 의미를 내포하고 있으며 method에 앞에 아무것도 선언하지 않았을 때의 default 상태이다.
    • plain메서드는 immutable한 규칙을 지키기 위해 어떠한 내부의 property 값도 변경하지 않는다.
    • plain과 반대로 mutating 메서드는 값을 변경할 수 있다.
  • immutable한 메서드가 default인 이유
    • mutating value들은 미래의 상태를 예측하기가 매우 어렵고 이 때문에 여러 bug를 야기할 수 있다.
    • 그렇기 때문에 해당 상황에 대한 솔루션으로 C/C++ family 언어들에서 mutable한 것들을 피하고 immutable한 모드를default로 하는 것을 최상위의 wishlist에 올렸다.
  • let (immutatable)으로 선언된 값의 mutating function을 호출하면 컴파일시 에러가 발생한다.
import Foundation

struct Point {
    var x: Int
    var y: Int

    mutating func update() {
        x = 2
        y = 2
    }
}

let point = Point(x: 1, y: 1)
point.update()

print(point)

/*
/tmp/D3730DC1-4D40-4C9B-9732-919A6846A49A.1XZJDC/main.swift:16:1: error: cannot use mutating member on immutable value: 'point' is a 'let' constant
point.update()
^~~~~
/tmp/D3730DC1-4D40-4C9B-9732-919A6846A49A.1XZJDC/main.swift:15:1: note: change 'let' to 'var' to make it mutable
let point = Point(x: 1, y: 1)
^~~
var
*/