관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming) 본문

카테고리 없음

[iOS - swift] 2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming)

jake-kim 2024. 5. 15. 01:49

1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화)

2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming)

~Copyable 연산자

  • ~Copyable을 사용하고 이 instance를 함수에서 주고 받을 때, 파라미터에 아무런 키워드를 사용하지 않으면 컴파일 에러가 발생
struct A: ~Copyable {
    var age: Int
    
    deinit {
        print("deinit: A")
    }
}

class ViewController: UIViewController {
    var a = A(age: 1)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        someFunc1(a: self.a)
    }
    
    /*
     compile error: Noncopyable parameter must specify its ownership
     - Add 'borrowing' for an immutable reference
     - Add 'inout' for a mutable reference
     - Add 'consuming' to take the value from the caller
     */
    func someFunc(a: A) {
        print(a.age)
    }
}
  • borrowing 연산자 (키워드)
    • get만 가능 (set 불가능)
    • deinit 호출되지 않음
    func someFunc1(a: borrowing A) {
        print(a.age)
//        a.age = 1 // Cannot assign to property: 'a' is a 'let' constant
    }
  • inout 연산자 (키워드)
    • 이미 swift5.9이전에 있던, struct 타입의 참조 타입을 받는 연산자
    • get, set 가능
    • deinit 호출되지 않음
    func someFunc2(a: inout A) {
        print(a.age)
        a.age = 1
    }
  • consuming 연산자 (키워드)
    • get, set가능
    • deinit 호출됨
    • consuming 키워드는 이전 포스팅 글에서 알아본 개념과 동일하며, 여기에 특정 인스턴스를 넘기면 그 인스턴스의 lifetime이 종료됨 (deinit호출)
    func someFunc3(a: consuming A) {
        print(a.age)
        a.age = 1
    }

 

* 전체 코드: https://github.com/JK0369/ExCopyable

 

* 참고: 

- https://github.com/apple/swift-evolution/blob/main/proposals/0390-noncopyable-structs-and-enums.md

Comments