본문 바로가기

All Categories/iOS & Swift

왜 프로토콜 변수 선언땐 let이 안될까? / weak와 unowned 의 차이

반응형

JercyCare+ 에서 주어진 질문에 대한 제 생각입니다. :)

왜 프로토콜 변수 선언땐 let이 안될까?

공식 문서: Swift - Protocols

A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. The protocol can then be adopted by a class, structure, or enumeration to provide an actual implementation of those requirements. Any type that satisfies the requirements of a protocol is said to conform to that protocol.
프로토콜은 메소드, 프로퍼티 등을 "정의"만 하고 프로토콜을 채택한 곳에서 "구현" 하기 때문에,
프로토콜 구현부에서는 gettable property에도 항상 다른 값이 들어올 수 있습니다.

let으로 선언하면 상수를 정의하여 값을 한번만 설정할 수 있고 다른 값을 가질 수 없습니다.

따라서 프로토콜 변수 선언 시에는 항상 var로 선언해야 한다고 생각합니다.

-> 이는 답이 없는 문제이나 개인적인 생각입니다! 다른 의견 있으시면 댓글로 편하게 남겨주시기 바라요 :)


weak와 unowned 의 차이

강한 순환 참조(Strong Reference Cycle)를 해결하기 위해 weak와 unowned 을 사용합니다.

weak는 optional에서 사용 할 수 있고, unowned는 non-optional인 경우에만 사용 가능하다는 것이 차이점입니다.
즉 unowned은 값이 있다고 가정하고 사용하여 nil이 주어지지 않아야 합니다.

 

참고 자료 - [Swift]weak와 unowned 사용 방법 by 민소네

 

Swift 5 Release Notes for Xcode 10.2

Swift 5.0부터 unowned 도 optiional 타입을 지원한다고 합니다!

하지만 또 다른 차이점은,
weak는 레퍼런스 카운트가 0일 때 해당 변수에 자동으로 nil을 할당해주지만,

unowned로 선언된 변수는 해제된 쓰레기값 포인터를 그대로 가지고 있습니다.
이 때 그 값에 접근 시 에러가 발생하는 차이가 있다고 합니다~!

반응형