Swift での「@〜〜〜」どこから来たやつなのかクイズ
Swift を使ってコードを書いていると、@〜〜〜
のような @
記号から始まる記述を行うことがあります。その @〜〜〜
がどこから来た何なのかについて、正確に把握していますか?
この記事は Swift Advent Calendar 2024 の20日目の記事です。
@〜〜〜
Swift の Swift における @〜〜〜
構文は、以下の5つを示すときに使います。
- Swift 言語における「属性(attribute)」
- 属性(attribute)の種類
- 宣言属性(declaration attribute)
- 型属性(type attribute)
- Switch ケース属性(switch case attribute)
- 属性(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)」です。
解答一覧・参照リンク
解答一覧・参照リンク
例題
@main
0-1. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
@State
0-2. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@ViewBuilder
0-3. 構文 | どこから |
---|---|
リザルトビルダー(result builder) | SwiftUI フレームワーク |
@MainActor
0-4. 構文 | どこから |
---|---|
グローバルアクター(global actor) | Swift 言語(Swift Standard Library) |
@Model
0-5. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | SwiftData フレームワーク |
初級
@EnvironmentObject
1-1. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Binding
1-2. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Published
1-3. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | Combine フレームワーク |
(↑ への typealias 定義) | (Foundation フレームワーク) |
@Observable
1-4. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | Swift 言語(Observation フレームワーク) |
@SceneBuilder
1-5. 構文 | どこから |
---|---|
リザルトビルダー(result builder) | SwiftUI フレームワーク |
@AppStorage
1-6. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Test
1-7. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | Swift 言語(Testing フレームワーク) |
@testable
1-8. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
@escaping
1-9. 構文 | どこから |
---|---|
属性(attribute)(型属性(type attribute)) | Swift 言語自体 |
@UIApplicationMain
1-10. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
中級
@Bindable
2-1. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Environment
2-2. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Previewable
2-3. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | SwiftUI フレームワーク |
@Query
2-4. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | SwiftData フレームワーク |
@MapContentBuilder
2-5. 構文 | どこから |
---|---|
リザルトビルダー(result builder) | MapKit フレームワークと SwiftUI フレームワーク |
@UIApplicationDelegateAdaptor
2-6. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | SwiftUI フレームワーク |
@Suite
2-7. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | Swift 言語(Testing フレームワーク) |
@unchecked
2-8. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
@Sendable
2-9. 構文 | どこから |
---|---|
属性(attribute)(型属性(type attribute)) | Swift 言語自体 |
@preconcurrency
2-10. 構文 | どこから |
---|---|
Swift 言語自体 | 属性(attribute)(宣言属性(declaration attribute)) |
上級
@Entry
3-1. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | SwiftUI フレームワーク |
@unknown
3-2. 構文 | どこから |
---|---|
属性(attribute)(Switch ケース属性(switch case attribute)) | Swift 言語自体 |
@Tag
3-3. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | Swift 言語(Testing フレームワーク) |
@ModelActor
3-4. 構文 | どこから |
---|---|
付属型マクロ(attached macro) | SwiftData フレームワーク |
@ViewLoading
3-5. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | AppKit フレームワーク |
プロパティラッパー(property wrapper) | UIKit フレームワーク |
@propertyWrapper
3-6. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
@CodableConfiguration
3-7. 構文 | どこから |
---|---|
プロパティラッパー(property wrapper) | Swift 言語(Foundation) |
@resultBuilder
3-8. 構文 | どこから |
---|---|
属性(attribute)(宣言属性(declaration attribute)) | Swift 言語自体 |
@TransferRepresentationBuilder
3-9. 構文 | どこから |
---|---|
リザルトビルダー(result builder) | Core Transferable フレームワーク |
@TaskLocal
3-10. 構文 | どこから |
---|---|
Swift 6.0 より前: プロパティラッパー(property wrapper) | Swift 言語 |
Swift 6.0 から: 付属型マクロ(attached macro) | Swift 言語 |
結果をシェアしよう!
あなたは何問正解できましたか?ソーシャルメディアで結果を投稿してください。
以下、投稿コピペ用です ↓
私は "Swift での「@〜〜〜」どこから来たやつなのかクイズ" でn問正解しました!
https://zenn.dev/treastrain/articles/7110008404105c #zenn #Qiitaアドカレ
Discussion