인프런 커뮤니티 질문&답변
70강 - 글로벌 액터로 격리된 Protocol 을 extension 에서 conform 시 타입 본체의 격리 수준 질문
해결된 질문
작성
·
23
0
강의에서는 5:16 쯤 "프로토콜 자체가 글로벌 격리로 구현된 프로토콜의 경우, 동일한 소스파일(.swift) 인 경우 확장에 프로토콜을 채택하더라도 타입 전체가 글로벌 격리로 추론됨" 이라고 설명합니다.
하지만 동일한 파일에서 아래와 같이, extension 에 protocol 을 채택해도 타입 본체는 nonisolated context 인것을 확인할 수 있었습니다.
@MainActor
protocol GloballyIsolated {
func updateUI(vc: UIViewController)
}
struct S {
func updateUI2(vc: UIViewController) {
// nonisolated context
vc.view.backgroundColor = .red // 💥💥💥 Main actor-isolated property 'backgroundColor' can not be mutated from a nonisolated context
}
}
extension S: GloballyIsolated {
func updateUI(vc: UIViewController) {
// MainActor context
vc.view.backgroundColor = .red
}
}설명하시는 시점과, 현재 시점의 동작이 달라진건가? 생각도 했었는데, 강의 6:58 쯤에서는 "GlobalProtocol 을 확장해서 채택한다하더라도 본체 자체는 비격리 된다" 라고 설명합니다.
즉, 동일한 코드에 대해 설명이 다른듯 하여 조금 헷갈리는 부분이 있어서요!
현재 시점에는 "프로토콜 자체가 글로벌 격리로 구현된 프로토콜의 경우, 동일한 소스파일(.swift) 인 경우 확장에 프로토콜을 채택하더라도 타입 전체가 글로벌 격리로 추론되지 않음" 으로 동작하는것 같은데 이 부분에 대한 강의 자료가 잘못된건지, 아니면 제가 놓친 부분이 있는지 궁금합니다.
감사합니다.
답변 1
1
아 네. sujinnaljin 님.
자료에 오류가 있었네요ㅠㅠ
(제가 다시 에볼루션 문서를 확인해보니, 제가 해석을 잘못했었네요ㅠ)
https://github.com/swiftlang/swift-evolution/blob/main/proposals/0316-global-actors.md
여기 들어가 보시면, 아래 부분이 있는데, 이 부분의 해석을 제가 해석을 잘못했었던 것 같네요.
A non-actor type that conforms to a global-actor-qualified protocol within the same source file as its primary definition infers actor isolation from that protocol:
그러니까, 같은 파일 안에서도 conformance 선언 위치가 본체(primary definition) 안에 있어야 한다는 뜻이네요.
그렇다면 결국 정리하자면, 본체에 정의되어야 한다는 건(어차피 같은 파일 안에 있어야 한다는 것과 동일한 말이니) 공식 문서에 같은 파일 안에 있어야 한다는 것(within the same source file)이 크게 의미가 있는 것은 아니고 결국 본체에 채택할 경우, 격리된다는 의미겠네요.
정리하자면, "프로토콜 자체가 글로벌 격리로 구현된 프로토콜의 경우, 동일한 소스파일(.swift)이라고 하더라도 확장에 프로토콜을 채택하면, 타입 전체가 글로벌 격리로 추론되지는 않음"라고 볼 수 있겠네요.
이 부분은 교재를 수정 및 수정이 필요한 부분을 추후 강의에 넣어놓도록 하겠습니다.
제가 교재를 만들고, 강의를 찍을 당시 수십개의 에볼루션 문서 중에 중요한 내용을 다시정리해서 제 나름대로의 목차를 뽑아서 만들다 보니 사소한 오류들이 조금 있네요. 넓은 아량으로 이해를 부탁드립니다.
감사합니다. :)





