Swiftを書いていると、なんとなく使えているつもりでも、いざ理由を聞かれると答えに詰まる場面がありませんか。この記事では、値の扱い方や非同期処理、SwiftUIの基本まで、Swiftの土台となる知識を10問のクイズで確認します。初心者の方は学習の理解度チェックに、経験者の方は知識の総ざらいに、ぜひ気軽に挑戦してみてください。
Q1 : Swiftの非同期処理で、async関数の結果を待つ際に呼び出し側で記述するキーワードはどれ? await defer yield wait
Swift 5.5で導入されたasync/awaitでは、非同期関数を呼び出す際にawaitキーワードを付けて、その処理が完了するまで一時停止することを明示します。awaitはasyncな関数内、またはTask内でのみ使用できます。deferはスコープ終了時に実行する処理を書くもので、yieldはジェネレータ的な機能に関連します。waitというキーワードはSwiftにありません。
Q2 : Swiftの配列に対して、各要素を変換して新しい配列を返す高階関数はどれ? map filter reduce sort
mapは配列などのコレクションの各要素にクロージャを適用し、その結果から新しい配列を作って返す高階関数です。例えば[1,2,3].map { $0 * 2 }は[2,4,6]を返します。filterは条件に合う要素だけを抽出し、reduceは要素を1つの値にまとめ、sortは並べ替えを行います。それぞれ役割が異なるため使い分けが重要です。
Q3 : Swiftのguard文について正しい説明はどれ? 条件がtrueのときだけelse節が実行される 条件がfalseのときにelse節が実行され、そのelse節ではスコープを抜ける必要がある ループ処理専用の構文である クラス内でのみ使用できる
guard文は条件がfalseの場合にelse節を実行する構文で、else節内ではreturn、break、continue、throwなどでそのスコープを必ず抜ける必要があります。これにより早期リターンが書きやすくなり、ネストが深くなるのを避けられます。またguard let で取り出したオプショナルの値は、guard文以降のスコープでも使い続けられるのが大きな特徴です。
Q4 : SwiftUIで、Viewの内部で変更可能な状態を保持し、値が変わるとViewを再描画させるために使うプロパティラッパーはどれ? @State @Published @Environment @Binding
@StateはSwiftUIのViewが自身の内部状態を保持するためのプロパティラッパーで、値が変更されるとViewが自動的に再描画されます。@Publishedは主にObservableObject内で使われ、@Bindingは親が持つ状態への参照を子Viewに渡す際に使います。@Environmentは環境値を読み取るためのものです。通常、Stateはprivateで宣言するのが推奨されます。
Q5 : Swiftのクロージャで、メモリリークの原因となる循環参照を避けるためにキャプチャリストで指定するものはどれ? [weak self] [strong all] [copy self] [static self]
クロージャがselfを強くキャプチャし、selfがそのクロージャを保持していると循環参照が起こり、メモリリークの原因になります。これを避けるにはキャプチャリストに[weak self]や[unowned self]を指定します。weakを使うとselfはオプショナルになり、解放済みならnilとなります。strong allやcopy selfといった構文はSwiftには存在しません。
Q6 : Swiftのenumは、ケースごとに異なる型の値を関連付けて保持できる(関連値を持てる)。 マル バツ
Swiftのenumは、case success(String)やcase failure(Error)のように、ケースごとに異なる型の関連値(Associated Values)を持たせることができます。標準ライブラリのResult型もこの仕組みで実装されています。他の言語のenumより表現力が高く、switch文でパターンマッチングを行いながら関連値を取り出せるため、状態を安全に表現するのに非常に便利です。
Q7 : Swiftのプロトコルに準拠した型が満たすべき要件を、あとから既存の型に追加して拡張するために使う構文はどれ? extension subclass typealias override
extensionは、既存のクラス・構造体・列挙型・プロトコルに対して、新しいメソッドや計算プロパティ、イニシャライザ、プロトコル準拠などを後から追加できる構文です。元のソースコードにアクセスできない型にも機能を追加できます。ただし格納プロパティの追加はできません。例えばextension Int: MyProtocol {}のように書いて、標準型に独自の準拠を加えられます。
Q8 : Swiftでクラスと構造体の違いとして正しいものはどれ? structはクラスと同様に継承できる structは値型でclassは参照型である classは値型でstructは参照型である structはdeinitを定義できる
Swiftのstructは値型で、代入や関数への受け渡しの際に値がコピーされます。一方classは参照型で、複数の変数が同じインスタンスを共有します。また継承やdeinitはclassだけが持つ機能で、structでは使えません。この違いにより、データの独立性を保ちたい場合はstruct、共有状態や継承が必要な場合はclassを選ぶのが一般的な指針です。Appleも基本はstructの利用を推奨しています。
Q9 : Swiftでオプショナル型の値がnilかもしれないとき、nilの場合に代わりのデフォルト値を使うための演算子はどれ? ?? !! ?: &&
??はnil合体演算子と呼ばれ、左辺のオプショナルがnilでなければその中身を、nilであれば右辺のデフォルト値を返します。例えばlet name = input ??
Q10 : Swiftで定数を宣言するために使うキーワードはどれ? var let const final
Swiftでは、一度値を代入すると変更できない定数をletで宣言し、値を後から変更できる変数をvarで宣言します。constやfinalは定数宣言のキーワードではありません。finalはクラスやメソッドの継承・オーバーライドを禁止する修飾子として使われます。Swiftでは変更する必要のない値はletで宣言することが推奨されています。
まとめ
いかがでしたか? 今回はSwiftクイズをお送りしました。
皆さんは何問正解できましたか?
今回はSwiftクイズを出題しました。
ぜひ、ほかのクイズにも挑戦してみてください!
次回のクイズもお楽しみに。