티스토리 뷰
[Swift 5.9] Consume operator to en the lifetime of a variable binding
doyeonjeong_ 2024. 3. 6. 17:54원문: https://www.hackingwithswift.com/swift/5.9/consume-operator
Swift에서 Consume 연산자를 이해하고 사용하기
Swift의 새로운 기능인 consume 연산자는 값의 Lifetime을 명시적으로 끝내는데 사용되며, 이를 통해 개발자가 데이터가 전달될 때 발생하는 불필요한 retain/release 호출을 줄일 수 있다.
기본 사용법
struct User {
var name: String
}
func createUser() {
let newUser = User(name: "Anonymous")
let userCopy = consume newUser // [✨]
print(userCopy.name)
}
createUser()
`// [✨]` 이 주석을 참고하자.
이것은 두 가지 작업을 동시에 수행한다.
newUser에서userCopy로 값을 복사하고,newUser의 Lifetime을 종료시킨다. (이후에newUser에 접근하려고 시도하면 오류 발생)
이렇게 하면 컴파일러에게 명시적으로 "이 값을 다시 사용하지 못하게 해 주세요"라고 지시할 수 있다.
데이터 소비하기
아래와 같이 데이터의 복사본이 필요 없고 단순히 파괴되었다고 표시하고 싶을 때도 특히 자주 사용될 수 있다.
func consumeUser() {
let newUser = User(name: "Anonymous")
_ = consume newUser
}
함수로 값 전달하기
아마도 값이 함수에 전달될 때 실제로 이 consume 연산자가 가장 많이 사용되지 않을까?
예시가 있다면 아래와 같다.
func createAndProcessUser() {
let newUser = User(name: "Anonymous")
process(user: consume newUser)
}
func process(user: User) {
print("Processing \(user.name)…")
}
createAndProcessUser()
추가 정보!
1. Swift는 코드의 어느 분기에서 값이 소비되었는지 추적하고, 조건부로 규칙을 적용한다.
예를 들어, 아래 코드에서는 두 가능성 중 하나만 User 인스턴스를 소비한다.
func greetRandomly() {
let user = User(name: "Taylor Swift")
if Bool.random() {
let userCopy = consume user
print("Hello, \(userCopy.name)")
} else {
print("Greetings, \(user.name)")
}
}
greetRandomly()
2. 엄밀히 말해 consume는 값이 아니라 바인딩에 작용한다.
이는 실제로 변수를 사용하여 소비하면, 변수를 재초기화하고 그것을 다시 사용할 수 있다는 것을 의미한다.
func createThenRecreate() {
var user = User(name: "Roy Kent")
_ = consume user
user = User(name: "Jamie Tartt")
print(user.name)
}
createThenRecreate()
이러한 방식으로, consume 연산자는 Swift 개발에서 데이터 관리를 더욱 효율적으로 할 수 있도록 도와준다. 이 기능을 활용하여 더욱 효율적인 코드를 작성해 보시길 바란다는데 어떻게 쓰이면 좋을지 고민해보는게 좋겠다.
개인적으로는 저장되면 안되는 문자열이나 코드같은 걸 처리할 때 기록에 남지 않게 하기 좋을 것 같다.
'Apple > Swift' 카테고리의 다른 글
| [Swift 5.9] Convenience Async[Throwing]Stream.makeStream methods (1) | 2024.03.07 |
|---|---|
| [Swift 5.9] Noncopyable structs and enums (0) | 2024.01.11 |
| [Swift 5.9] Macro (0) | 2024.01.11 |
| [Swift 5.9] Value and Type Parameter Packs (0) | 2024.01.09 |
| [Swift 5.9] if and switch expressions (1) | 2024.01.08 |
- Total
- Today
- Yesterday
- flutter
- SWIFT
- 플러터 업데이트
- 플러터업데이트
- 플러터네이티브
- 렌더링최적화
- 오류해결
- flutter 3.7
- flutter_lints
- 플러터ios애니메이션
- 디버그 기호 업로드
- swiftmigration
- 플러터
- Sample Apps Tutorials
- Play Integrity API
- 트러블슈팅
- flutter3.7
- ios
- flutter updates
- lints
- 16KB지원
- 배포 오류 해결
- 오블완
- GooglePlayConsole
- Android
- 개발신입
- 다트문법
- analysis_options
- 권장조치
- SwiftUI Tutorial
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |