Open7

Xcode15/iOS17/Swift5.9メモ

さしもんさしもん

Swift Macros

https://www.swift.org/blog/swift-5.9-released/#:~:text=low-level code.-,Macros,-Macros help developers
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/

SwiftSyntaxを使った機能で
#macroNameを使ったfreestandingな記法
@MacroName attributeをつけて宣言される記法
の2つの記法がある

さしもんさしもん

SwiftSyntax

Swiftソースコードの構文解析、検査、書き換え、ソースコードの生成を行うSwiftライブラリ
前からあったもののこれまではSourceryやSwiftLint、swift-formatなどのツールの中で使われていて直接使う機会はなかったがマクロを書いたりデバッグするには直接SwiftSyntaxを使う必要が出てくるみたい
参照: https://dev.classmethod.jp/articles/iosdc-japan-2023-report-08/
→ これの中の参照されていたスライドがわかりやすい

https://speakerdeck.com/orgachem/learn-syntax-tree-for-swift-macro-in-10-minutes
https://speakerdeck.com/kishikawakatsumi/mastering-swiftsyntax
その他
https://qiita.com/Ryu0118/items/5e8344e589054862b04d
https://zenn.dev/kyome/articles/fbf82b5b4dd2e2

理解したこと

  • SyntaxParser.parseで構文解析された結果がSourceFileSyntax
    → SourceFileSyntaxはSyntaxTreeの構造になっている
  • 単に値を書き換えたりせずに探索するだけならSyntaxVisitor、値を書き換える場合はSyntaxRewriterを使う

面白そうだから後で読む

https://booth.pm/ja/items/1310582
https://github.com/apple/swift-evolution/tree/main/proposals
https://github.com/apple/swift/blob/f7a8bc2e048f5e1de450ee1d307f9734ea4bef5e/lib/Macros/Sources/ObservationMacros/ObservableMacro.swift#L1

さしもんさしもん

所有権

所有権がどこにあるのか
borrowing: 所有権は呼び出しもと。自分で所有権を持ったまま相手に貸す。readOnly
consuming: 所有権はよびだし先
inout: ???

例(borrowing)

以下のborrowingはコンパイルエラー'value' is borrowed and cannot be consumed
どうやらエラメッセージの通りborrowingしているものを内部で保持しようとすると使用することになるらしい

struct Value {

}
func action(_ value: borrowing Value) {
  let a = value
}

以下のborrowingもコンパイルエラー'value' is borrowed and cannot be consumed
print(<items: Any...)でAny型を取るから型変換の目的で使用されるため?

func action(_ value: borrowing Value) {
    print(value)
}

回避策
borrowingを使っているため所有権は自分自身になくて、消費するならコピーして別物とする必要がある

func action(_ value: borrowing Value) {
  let a = copy value や print(copy value)みたいにコピーして使う
}

以下は明示的にcopyは記述してないけれど、値型なので同様にxに渡すときにコピーされるため

func action(_ value: borrowing Value) {
  x(value)
}
func x(_ value: Value) {
}

302回を参照

さしもんさしもん

SwiftData
SampleCode: https://developer.apple.com/xcode/swiftdata/ ページ下部から

さしもんさしもん

概要

@Modelのついた型をDBファイルで管理する。操作はmodelContextを利用して行う
SwiftDataの後ろにはCoreDataが存在している
なのでSwiftDataはCoreDataと同じプロジェクト内で併用して利用することが可能
これにより機能が限られているからCoreDataじゃないと存在しない機能はSwiftDataからCoreDataを経由して使える
ただしCoreDataと同一プロジェクト内で併用して使うにはschemaをマッチさせる必要がある

CoreDataは昔から存在する機能でSwiftDataはiOS17から提供されている && SwiftDataの裏でCoraDataが動いているということは、iOS17未満をサポートしている場合はCoreDataを利用してiOS17が下限になったらSwiftDataへ移行させたり、同一プロジェクトにおいてiOS17未満はCoreData、iOS17以上はSwiftDataといった混合の構成でもいけそう

さしもんさしもん

ブックマーク
アセットの自動生成
文字列カタログ