일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Required Reason API
- SwiftUI Boolean 값
- MKMapItem
- 단일 책임원칙
- Protocol
- font book
- WeatherManager
- 클로저의 캡슐화
- addannotation
- MKMapViewDelegate
- Timer
- UIAlertAction
- UICollectionViewFlowLayout
- 러닝기록앱
- CLLocationManagerDelegate
- weatherKit
- dispatchsource
- RunningTimer
- Xcode
- 한국어 개인정보처리방침
- 서체관리자
- CoreLocation
- swift
- App Store Connect
- weak var
- xcode로 날씨앱 만들기
- 러닝타이머
- Startign Assignments
- 영문 개인정보처리방침
- AnyObject
- Today
- Total
VesselWheel
구조체(Struct)의 mutating 키워드에 대해서 설명해주세요. 본문
https://skytitan.tistory.com/551
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
*/
'Grammary in Swift' 카테고리의 다른 글
iOS에서 뷰(View)와 레이어(Layer)의 개념과 차이점에 대해 설명해보세요. (0) | 2024.03.22 |
---|---|
확장(Extension)에 대해서 설명해주세요. (0) | 2024.03.22 |
옵셔널(Optional)에 대해서 설명해주세요. (0) | 2024.03.19 |
클래스와 프로토콜 (0) | 2024.03.18 |
구조체(Struct)에 대해서 설명해주세요. 어떤 경우 사용하나요? (0) | 2024.03.14 |