【Swift6 Concurrency】 新しい @Observable クラスの書き方を知らないやつwww

私です。

将来に向けて厳しくした Xcode 設定でのどうなるかの検証です。


サンプルコード。

最もよくある非同期処理のパターンの一つだと思います。

ただ WEB リクエストしてそれを表示するやつ。



👉 【SwiftUI】シンプルに HTTPリクエスト でお天気情報取得 hatena-bookmark

どうなるか。

 

🧑🏻‍💻 Passing argument of non-sendable type 'Requester' outside of main actor-isolated context may introduce data races

一応、動きますが。

こんな警告でました。

Passing argument of non-sendable type 'Requester' outside of main actor-isolated context may introduce data races

なんなんですかね。

なんかおかしいですか。

 

🧑🏻‍💻 Non-final class 'Requester' cannot conform to 'Sendable'; use '@unchecked Sendable'

無邪気に Sendable を継承します。

一行のみの変更です。


class Requester: Sendable {

Non-final class 'Requester' cannot conform to 'Sendable'; use '@unchecked Sendable'

と出ました。

よって、結局、以下の2つのどちらかで警告は消えます。


final class Requester: Sendable {


class Requester: @unchecked Sendable {

ここら辺でこれだけつまずいてるのだけども。

👉 Sendable | Apple Developer Documentation hatena-bookmark

 

🤔 気持ち悪さ

よくこの @Observable クラスが、

いわゆる「MVVM でいうところの ModelView」

となってるコードをよく見かけます。

これが「アクター境界」を越えていいの ?

 

🤔 関連記事



【Swift】最もシンプルに実行時間を計測する

これくらいでいいよなあ。


let start = Date()
try? await Task.sleep(for: .milliseconds(1234))
let end = -start.timeIntervalSinceNow
print(String(format: "%.3f", end))
// 1.246



【SwiftData】@Query の検索条件や並び順を変更する

@Query は Observable で便利です。

引数に、検索条件や並び順を書いておけば、

監視して変更があれば、更新してくれます。


👉 【SwiftData】@Query の引数と Descriptor の関係 hatena-bookmark

しかし、この検索条件や並び順の基準は

ユーザーの意図によって変更の必要があることのほうが多いです。

どうやって、書き換えるか。


struct UserListView: View {
  @Query var users: [User]
  
  init(sort: SortDescriptor<User>) {
    _users = Query(sort: [sort])

👉 How to dynamically change a query's sort order or predicate - a free SwiftData by Example tutorial hatena-bookmark


struct BirdsSearchResults<Content: View>: View {
  @Binding var searchText: String
  @Query private var birds: [Bird]
  private var content: (Bird) -> Content
    
  init(searchText: Binding<String>, @ViewBuilder content: @escaping (Bird) -> Content) {
    _searchText = searchText
    _birds = Query(sort: \.creationDate)
    self.content = content
  }

👉 sample-backyard-birds/Multiplatform/Birds/BirdsSearchResults.swift at 1843d5655bf884b501e2889ad9862ec58978fdbe · apple/sample-backyard-birds hatena-bookmark

どうやら、今現在としては、


_birds = Query(sort: \.creationDate)

というような

「_ (アンダースコア)」

を使った内部的な Query の書き換えが本筋といったところでしょうか。

Query の引数には、

SortDescriptorFetchDescriptor もあるので、

複雑な条件により抽出も並び替えも可能です。

👉 【SwiftData】@Query の引数と Descriptor の関係 hatena-bookmark

しかし、他の方法ないんですかね。