Avatar
Avatar
kntk
あんまり詳しくないので完全に追えてないんですが ASTをいじってるだけで特別なことはやってないように見えます https://github.com/apple/swift/pull/33674 「Concurrency Interoperability with Objective-Cはただのシンタックシュガー」という仮定の上で アドバイスとしてどなたかにお聞きしたいんですが メインスレッドからの呼び出しが必須で(そうでないとクラッシュする) Objective-Cで書かれたライブラリの関数 : application.acquireToken()があった時 asyncなのにMainActorが伝播するこの仕様を意図的に使う選択をどう思われますか? (自分だったら使わない、くらいの感想で良いので聞かせていただけたら) 「変な」挙動を使う危険性 vs 可読性 実際のコードは↓みたいな感じで、ログイン画面の起動です (ユーザーが6-7000人くらいいるリリースしているサービスで、ここが壊れると致命傷ではあります) // 既存の書き方 public func signInA() async throws -> AuthResult { try await withCheckedThrowingContinuation { continuation in Task { @MainActor in application.acquireToken() { result, error in if let error = error { continuation.resume(throwing: self.createError(from: error)) return } if let result = result { continuation.resume(returning: .init(accessToken: result.accessToken)) return } continuation.resume(throwing: AuthError.unknown) } } } } // asyncへの自動変換を使った書き方 @MainActor public func signInB() async throws -> AuthResult { try await application.acquireToken() } (edited)
すごく細かいんですが、TaskでMainActorを指定するより、signInA 自体に @MainActorを付けるほうが無駄なスイッチが減ります。