스위프트 격리된 프로토콜 준수

Swift isolated conformance

프로토콜 준수 자체를 액터에 묶어 안전한 호출 문맥만 허용합니다.

···
html
<div class="v"><header><b>ACTOR CONFORMANCE</b><span id="state"></span></header><main><div class="conf"><div class="call" id="call">protocol call</div><div class="gate" id="gate">GATE</div><div class="target">@MainActor<br>state</div></div><div class="verdict" id="verdict"></div></main><footer>compiler checks the conformance context</footer></div>
css
.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,3.2vmin,17px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.28} .conf{height:70%;display:flex;align-items:center;justify-content:space-around;gap:4px}.call,.target{width:38%;box-sizing:border-box;border:1px solid var(--line);border-radius:7px;padding:12px 3px;text-align:center;font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}.gate{width:17%;border:2px solid var(--accent);border-radius:5px;padding:8px 0;text-align:center;color:var(--accent);font:700 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}.verdict{text-align:center;color:var(--accent);font:600 clamp(12px,2.7vmin,16px) var(--font-sans, sans-serif)}
js
let n=0;function draw(){document.getElementById("call").textContent=n?"off actor call":"MainActor call";document.getElementById("gate").textContent=n?"NO":"YES";document.getElementById("gate").style.borderColor=n?"var(--accent-2)":"var(--accent)";document.getElementById("verdict").textContent=n?"conformance unavailable":"conformance available";document.getElementById("state").textContent=n?"unsafe context":"safe context";n=1-n}draw();setInterval(draw,1400)

Swift 6.2는 MainActor 상태를 사용하는 타입이 프로토콜을 따를 때 준수 관계에도 액터 격리를 표시할 수 있습니다. 컴파일러는 그 준수를 메인 액터 문맥에서만 사용하도록 검사합니다.

프로토콜 값이 액터 밖으로 이동해 요구 메서드를 호출할 수 있는 상황이라면 이 준수를 쓸 수 없습니다. 데모의 문은 타입 자체의 이동이 아니라 격리된 준수의 사용 가능 여부를 나타냅니다.

언제 쓰나

UI 상태를 읽는 타입에 동기 프로토콜 요구사항을 구현할 때 씁니다.

페이지로 열기 ↗