Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

iOS 18 から追加された SwiftUI の傾向について調べてみる

swiftty
November 27, 2024

iOS 18 から追加された SwiftUI の傾向について調べてみる

【ハイブリット開催】Mobile勉強会 ウォンテッドリー × チームラボ × Sansan #17
https://wantedly.connpass.com/event/332981/

で発表した内容です

swiftty

November 27, 2024
Tweet

More Decks by swiftty

Other Decks in Technology

Transcript

  1. swiftinterface とは Swift はヘッダファイルは .h などではなく、 .swiftinterface というファイルにパブリッ クな API

    が宣言されている 中身は定義ジャンプで見るときと同じような形式の Swift 表現 ※ 定義ジャンプでは表示されないパブリックな定義も含めて見ることができる ... @available(iOS 18.0, macOS 15.0, tvOS 18.0, watchOS 11.0, visionOS 2.0, *)   public struct ScrollPhaseChangeContext { public var geometry: SwiftUICore.ScrollGeometry { get } public var velocity: CoreFoundation.CGVector? { get } } ...
  2. SyntaxRewriter SyntaxRewriter を用いて実装 ~DeclSyntax の attributes に @available 定義が格納されている node.attributes

    の中から AvailabilityArgumentListSyntax のものを探索し platform と version を判定 final class AvailableIOS18Rewriter: SyntaxRewriter { override func visit(_ node: StructDeclSyntax) -> DeclSyntax { ... } private func checkAvailableForIOS18(_ arguments: AvailabilityArgumentListSyntax) -> Bool { return arguments.contains(where: { argument in switch argument.argument { case .availabilityVersionRestriction(let version): return version.platform.trimmed.text == "iOS" && version.version?.major.trimmed.text == "18"   default: return false } }) }
  3. SyntaxRewriter SyntaxRewriter を用いて実装 @available(iOS 18.x) が見つからなければ MissingDeclSyntax を返し、 iOS 18

    ではない定義を空文字で書き換える final class AvailableIOS18Rewriter: SyntaxRewriter { override func visit(_ node: StructDeclSyntax) -> DeclSyntax {   let hasAvailable = checkAvailableForIOS18(...) if hasAvailable { return super.visit(node) } else { return DeclSyntax(MissingDeclSyntax(placeholder: "")) } }
  4. 傾向 Tab 関連 .tabItem {} が非推奨になり別コンポーネントが追加された TabView { Tab("Home", systemImage:

    "home") {       HomeView() } } Scroll 関連 .scrollPosition() や .onScrollVisibilityChange() などスクロールされる要素の制御の強 化
  5. まとめ 切り口を変えて調べてみるという取り組みは達成できた iOS 18 においては _printChanges などのような新しい発見はなかった。 。 。 SwiftSyntax

    のちょっと変わった使い方の紹介 Tab のデータ構造が変わった影響で関連 API の追加が目立っている Scroll や Accessibility の機能追加も継続的に進められている
  6. 付録 private func checkAvailableForIOS18(_ attributes: AttributeListSyntax) -> Bool? { func

    checkArguments(_ arguments: AvailabilityArgumentListSyntax) -> Bool { arguments.contains(where: { argument in switch argument.argument { case .availabilityVersionRestriction(let version): return version.platform.trimmed.text == "iOS" && version.version?.major.trimmed.text == "18" default: return false } }) } let attributes = attributes.compactMap { attribute in switch attribute { case .attribute(let attr): return attr.arguments?.as(AvailabilityArgumentListSyntax.self) default: return nil } } if attributes.isEmpty { return nil } return attributes.contains(where: { attribute in checkArguments(attribute) }) }