Avatar
質問です。 AVSpeechSynthesizer は non-Sendable な型です。これを保持する actor を考えます。このとき、その AVSpeechSynthesizer インスタンスはその actor インスタンスにisolateされます。 次に、その actorAVSpeechSynthesizerDelegate に準拠させ、保持している AVSpeechSynthesizer インスタンスの delegate にセットします。 このとき、delegateメソッドは nonisolated である必要があるので、次のようになります。 nonisolated func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { ... } 一見、 synthesizeractor のisolation domainの外に出てしまっているように見えますが、このdelegateメソッドは同期メソッドなので呼び出し元のcontextで呼び出されるため安全なはずです。 たとえば、今 AVSpeechSynthesizer インスタンスは actor インスタンスにisolateされているので、 AVSpeechSynthesizer がこのdelegateメソッドを呼び出しても actor インスタンスのcontextで呼び出されるはずです。 しかし、このdelegateメソッドの中で self.assertIsolated() するとエラーになってしまいました。AVSpeechSynthesizer がフルSwiftで実装されていれば AVSpeechSynthesizer インスタンスがisolation boundaryを超えるのをコンパイラが許さないので、そのようなことは起こせないと思います。 これは、 AVSpeechSynthesizer がObj-Cで実装されているため、Obj-Cを経由することで(Swiftコンパイラの感知できないところでisolation boundaryを越えて)穴が生まれてしまったと考えるのが良いでしょうか? (edited)