🏟️

Swift での「@〜〜〜」どこから来たやつなのかクイズ

2024/12/20に公開

Swift を使ってコードを書いていると、@〜〜〜 のような @ 記号から始まる記述を行うことがあります。その @〜〜〜 がどこから来た何なのかについて、正確に把握していますか?

この記事は Swift Advent Calendar 2024 の20日目の記事です。

Swift の @〜〜〜

Swift における @〜〜〜 構文は、以下の5つを示すときに使います。

  • Swift 言語における「属性(attribute)」
    • 属性(attribute)の種類
      • 宣言属性(declaration attribute)
      • 型属性(type attribute)
      • Switch ケース属性(switch case attribute)
  • Swift 言語の機能である「プロパティラッパー(property wrapper)」
  • Swift 言語の機能である「リザルトビルダー(result builder)」
  • Swift 言語の機能である「グローバルアクター(global actor)」
  • Swift 言語の機能である「付属型マクロ(attached macro)」

たとえば Swift を使って iOS アプリケーション開発を行うとき、@main@State@ViewBuilder@MainActor@Model などといったものを使うと思いますが、それらはすべて上記5つのいずれかに分類でき、またそれが「プロパティラッパー」・「リザルトビルダー」・「グローバルアクター」・「付属型マクロ」であれば、何かしらのフレームワークに定義されています。

例題

Q0-1. @main はどこから来た何?

Q0-1. @main の答え
@main は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

Q0-2. @State はどこから来た何?

Q0-2. @State の答え
@State は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q0-3. @ViewBuilder はどこから来た何?

Q0-3. @ViewBuilder の答え
@ViewBuilder は「SwiftUI フレームワーク」に定義されている「リザルトビルダー(result builder)」です。

Q0-4. @MainActor はどこから来た何?

Q0-4. @MainActor の答え
@MainActor は「Swift 言語(Swift Standard Library)」に定義されている「グローバルアクター(global actor)」です。

Q0-5. @Model はどこから来た何?

Q0-5. @Model の答え
@Model は「SwiftData フレームワーク」に定義されている「付属型マクロ(attached macro)」です。

クイズ - 初級

Q1-1. @EnvironmentObject はどこから来た何?

Q1-1. @EnvironmentObject の答え

@EnvironmentObject は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q1-2. @Binding はどこから来た何?

Q1-2. @Binding の答え

@Binding は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q1-3. @Published はどこから来た何?

Q1-3. @Published の答え

@Published は「Combine フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。
(ただし、「Combine フレームワーク」が使える環境において「Foundation フレームワーク」に typealias の定義もあります。)

Q1-4. @Observable はどこから来た何?

Q1-4. @Observable の答え

@Observable は「Swift 言語(Observation フレームワーク)」に定義されている「付属型マクロ(attached macro)」です。

Q1-5. @SceneBuilder はどこから来た何?

Q1-5. @SceneBuilder の答え

@SceneBuilder は「SwiftUI フレームワーク」に定義されている「リザルトビルダー(result builder)」です。

Q1-6. @AppStorage はどこから来た何?

Q1-6. @AppStorage の答え

@AppStorage は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q1-7. @Test はどこから来た何?

Q1-7. @Test の答え

@Test は「Swift 言語(Testing フレームワーク)」に定義されている「付属型マクロ(attached macro)」です。

Q1-8. @testable はどこから来た何?

Q1-8. @testable の答え

@testable は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

Q1-9. @escaping はどこから来た何?

Q1-9. @escaping の答え

@escaping は「Swift 言語自体」に定義されている「属性(attribute)(型属性(type attribute))」です。

Q1-10. @UIApplicationMain はどこから来た何?

Q1-10. @UIApplicationMain の答え

@UIApplicationMain は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

クイズ - 中級

Q2-1. @Bindable はどこから来た何?

Q2-1. @Bindable の答え

@Bindable は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q2-2. @Environment はどこから来た何?

Q2-2. @Environment の答え

@Environment は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q2-3. @Previewable はどこから来た何?

Q2-3. @Previewable の答え

@Previewable は「SwiftUI フレームワーク」に定義されている「付属型マクロ(attached macro)」です。

Q2-4. @Query はどこから来た何?

Q2-4. @Query の答え

@Query は「SwiftData フレームワーク」に定義されている「付属型マクロ(attached macro)」です。

Q2-5. @MapContentBuilder はどこから来た何?

Q2-5. @MapContentBuilder の答え

@MapContentBuilder は「MapKit フレームワークと SwiftUI フレームワーク」に定義されている「リザルトビルダー(result builder)」です。

Q2-6. @UIApplicationDelegateAdaptor はどこから来た何?

Q2-6. @UIApplicationDelegateAdaptor の答え

@UIApplicationDelegateAdaptor は「SwiftUI フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q2-7. @Suite はどこから来た何?

Q2-7. @Suite の答え

@Suite は「Swift 言語(Testing フレームワーク)」に定義されている「付属型マクロ(attached macro)」です。

Q2-8. @unchecked はどこから来た何?

Q2-8. @unchecked の答え

@unchecked は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

Q2-9. @Sendable はどこから来た何?

Q2-9. @Sendable の答え

@Sendable は「Swift 言語自体」に定義されている「属性(attribute)(型属性(type attribute))」です。

Q2-10. @preconcurrency はどこから来た何?

Q2-10. @preconcurrency の答え

@preconcurrency は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

クイズ - 上級

Q3-1. @Entry はどこから来た何?

Q3-1. @Entry の答え

@Entry は「SwiftUI フレームワーク」に定義されている「付属型マクロ(attached macro)」です。

Q3-2. @unknown はどこから来た何?

Q3-2. @unknown の答え

@unknown は「Swift 言語自体」に定義されている「属性(attribute)(Switch ケース属性(switch case attribute))」です。

Q3-3. @Tag はどこから来た何?

Q3-3. @Tag の答え

@Tag は「Swift 言語(Testing フレームワーク)」に定義されている「付属型マクロ(attached macro)」です。

Q3-4. @ModelActor はどこから来た何?

Q3-4. @ModelActor の答え

@ModelActor は「SwiftData フレームワーク」に定義されている「付属型マクロ(attached macro)」です。

Q3-5. @ViewLoading はどこから来た何?

Q3-5. @ViewLoading の答え

@ViewLoading は「AppKit フレームワーク」や「UIKit フレームワーク」に定義されている「プロパティラッパー(property wrapper)」です。

Q3-6. @propertyWrapper はどこから来た何?

Q3-6. @propertyWrapper の答え

@propertyWrapper は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

Q3-7. @CodableConfiguration はどこから来た何?

Q3-7. @CodableConfiguration の答え

@CodableConfiguration は「Swift 言語(Foundation)」に定義されている「プロパティラッパー(property wrapper)」です。

Q3-8. @resultBuilder はどこから来た何?

Q3-8. @resultBuilder の答え

@resultBuilder は「Swift 言語自体」に定義されている「属性(attribute)(宣言属性(declaration attribute))」です。

Q3-9. @TransferRepresentationBuilder はどこから来た何?

Q3-9. @TransferRepresentationBuilder の答え

@TransferRepresentationBuilder は「Core Transferable フレームワーク」に定義されている「リザルトビルダー(result builder)」です。

Q3-10. @TaskLocal はどこから来た何?

Q3-10. @TaskLocal の答え

@TaskLocal は「Swift 言語」に定義されており、Swift 6.0 より前は「プロパティラッパー(property wrapper)」、Swift 6.0 からは「付属型マクロ(attached macro)」です。

解答一覧・参照リンク

解答一覧・参照リンク

例題

0-1. @main

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

0-2. @State

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

0-3. @ViewBuilder

構文 どこから
リザルトビルダー(result builder) SwiftUI フレームワーク

0-4. @MainActor

構文 どこから
グローバルアクター(global actor) Swift 言語(Swift Standard Library)

0-5. @Model

構文 どこから
付属型マクロ(attached macro) SwiftData フレームワーク

初級

1-1. @EnvironmentObject

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

1-2. @Binding

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

1-3. @Published

構文 どこから
プロパティラッパー(property wrapper) Combine フレームワーク
(↑ への typealias 定義) (Foundation フレームワーク)

1-4. @Observable

構文 どこから
付属型マクロ(attached macro) Swift 言語(Observation フレームワーク)

1-5. @SceneBuilder

構文 どこから
リザルトビルダー(result builder) SwiftUI フレームワーク

1-6. @AppStorage

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

1-7. @Test

構文 どこから
付属型マクロ(attached macro) Swift 言語(Testing フレームワーク)

1-8. @testable

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

1-9. @escaping

構文 どこから
属性(attribute)(型属性(type attribute)) Swift 言語自体

1-10. @UIApplicationMain

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

中級

2-1. @Bindable

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

2-2. @Environment

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

2-3. @Previewable

構文 どこから
付属型マクロ(attached macro) SwiftUI フレームワーク

2-4. @Query

構文 どこから
付属型マクロ(attached macro) SwiftData フレームワーク

2-5. @MapContentBuilder

構文 どこから
リザルトビルダー(result builder) MapKit フレームワークと SwiftUI フレームワーク

2-6. @UIApplicationDelegateAdaptor

構文 どこから
プロパティラッパー(property wrapper) SwiftUI フレームワーク

2-7. @Suite

構文 どこから
付属型マクロ(attached macro) Swift 言語(Testing フレームワーク)

2-8. @unchecked

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

2-9. @Sendable

構文 どこから
属性(attribute)(型属性(type attribute)) Swift 言語自体

2-10. @preconcurrency

構文 どこから
Swift 言語自体 属性(attribute)(宣言属性(declaration attribute))

上級

3-1. @Entry

構文 どこから
付属型マクロ(attached macro) SwiftUI フレームワーク

3-2. @unknown

構文 どこから
属性(attribute)(Switch ケース属性(switch case attribute)) Swift 言語自体

3-3. @Tag

構文 どこから
付属型マクロ(attached macro) Swift 言語(Testing フレームワーク)

3-4. @ModelActor

構文 どこから
付属型マクロ(attached macro) SwiftData フレームワーク

3-5. @ViewLoading

構文 どこから
プロパティラッパー(property wrapper) AppKit フレームワーク
プロパティラッパー(property wrapper) UIKit フレームワーク

3-6. @propertyWrapper

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

3-7. @CodableConfiguration

構文 どこから
プロパティラッパー(property wrapper) Swift 言語(Foundation)

3-8. @resultBuilder

構文 どこから
属性(attribute)(宣言属性(declaration attribute)) Swift 言語自体

3-9. @TransferRepresentationBuilder

構文 どこから
リザルトビルダー(result builder) Core Transferable フレームワーク

3-10. @TaskLocal

構文 どこから
Swift 6.0 より前: プロパティラッパー(property wrapper) Swift 言語
Swift 6.0 から: 付属型マクロ(attached macro) Swift 言語

結果をシェアしよう!

あなたは何問正解できましたか?ソーシャルメディアで結果を投稿してください。

以下、投稿コピペ用です ↓

私は "Swift での「@〜〜〜」どこから来たやつなのかクイズ" でn問正解しました!

https://zenn.dev/treastrain/articles/7110008404105c #zenn #Qiitaアドカレ

Discussion