티스토리 뷰

원문: 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()

 

`// [✨]` 이 주석을 참고하자.

이것은 두 가지 작업을 동시에 수행한다.

  1. newUser에서 userCopy로 값을 복사하고,
  2. 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 개발에서 데이터 관리를 더욱 효율적으로 할 수 있도록 도와준다. 이 기능을 활용하여 더욱 효율적인 코드를 작성해 보시길 바란다는데 어떻게 쓰이면 좋을지 고민해보는게 좋겠다.

 

개인적으로는 저장되면 안되는 문자열이나 코드같은 걸 처리할 때 기록에 남지 않게 하기 좋을 것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함