Sendable

치킨치·2024년 5월 3일
0

iOS에 Actor가 도입되면서 동시성에 관련한 새 protocol Sendable이 추가되었다.
다양한 서드파티에서 이 프로토콜을 도입해오고 있는데, 정확한 개념을 잡고 싶었다.

class는 내부 변수 조작이 일반적이기 때문에 Sendable에 적합하지 않을 수 있다.
하지만 꼭 Sendable하게 만들고 싶다면 3가지를 충족시키면 된다:
1. final class
2. 클래스 멤버가 모두 상수
3. Sendable를 상수에 저장
1번과 2번 조건을 충족하지 않으면 위 그림처럼 컴파일러에서 warning을 보여준다(에러는 아님).
warning 원인을 해결해주면 멤버변수가 let이미 잘못된 코드라는 컴파일 오류가 보이는데, 당연한 결과이다.
3번 조건을 충족하지 않으면 컴파일러 에러 "Reference to captured var '변수명' in concurrently-executing code"가 나타난다.
동시실행코드 안에서 캡쳐된 var 변수에 참조 발생이란 의미로, 저장된 레퍼런스값이 변수에 저장된다면 조작가능한 상태이기 때문에 동시성 안정성이 보장되지 않는다고 알려주는 것이다.
변수를 상수로 바꿔 3번 조건을 충족시키면 비로소야 모든 알람과 에러를 해결 할 수 있다.
struct의 Sendable 조건은 1가지인데:
- Sendable를 상수에 저장
에러 또한 class의 3번 조건과 같다.

추신

Sendable struct 인스턴스 저장소가 변수일 때 발생하는 Reference 어쩌구 에러는 내가 가진 개념에 의문을 던지고 있다. c++에서는 call by value와 call by reference를 명확하게 나누고 있어서, 스택역역인 struct에 접근하는 것은 레퍼런스 접근이 아니기 때문이다. 물론 swift언어는 내부적으로 struct를 call by refernce를 사용할 수도 있겠지만, 실제로 stack과 heap 메모리영역 차이를 버리고 있는가에 대한 의문이 남았다. swift 언어에 정통한 사람이 알려주면 좋겠는데..

profile
풀스텍이었던 iOS개발자

0개의 댓글