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)」です。
解答一覧・参照リンク
解答一覧・参照リンク
例題
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