Avatar
うまく説明できるかわからないですが、init内でactor isolatedなプロパティに安全にアクセスできる間はそれをできるようにして、安全でなくなったタイミングで(letではない)isolatedなプロパティへの直接アクセスを禁止する、というように変わることをdecay(衰退)と言っています。 プロポーザルに上がっていた例で見ると class NotSendableString { /* ... */ } final class Address: Sendable { /* ... */ } func greetCharlie(_ charlie: Charlie) {} actor Charlie { var score: Int let fixedNonSendable: NotSendableString let fixedSendable: Address var me: Charlie? = nil func incrementScore() { self.score += 1 } nonisolated func nonisolatedMethod() {} init(_ initialScore: Int) { self.score = initialScore // ✅ self.fixedNonSendable = NotSendableString("Charlie") // ✅ self.fixedSendable = NotSendableString("123 Main St.") // ✅ if score > 50 { nonisolatedMethod() // ✅ selfのnonisolatedな使用 greetCharlie(self) // ✅ selfのnonisolatedな使用 self.me = self // ✅ selfのnonisolatedな使用 } else if score < 50 { score = 50 } assert(score >= 50) // ❌ selfのnonisolatedな使用後に、可変のisolatedなプロパティへアクセスできなくなる _ = self.fixedNonSendable // ❌ selfのnonisolatedな使用後に、non-Sendableなプロパティへアクセスできなくなる _ = self.fixedSendable Task { await self.incrementScore() } // ✅ selfのnonisolatedな使用は引き続きOK(awaitしているのでactor isolated) } } (edited)