본문 바로가기
Swift

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

by Sky Titan 2022. 6. 19.
728x90
 

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. As the "The Swift Programming Language" iBook states: By default, the properties of a value type

stackoverflow.com

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

  • 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
*/

 

728x90

댓글