こんにちは!yagijinです。
iOSDC Japan 2023にてGMOインターネットグループのブースで、iOSやサービスにまつわる問題を解いてマスを埋めるビンゴ企画を行いました。 いくつかの問題は、社内のモバイルエンジニアで作成したので、本ブログではその解説をします。
問題も載せているので当日参加されなかった方もぜひ挑戦してみてください!
問題と解説
今回は、ペパボが担当した問題についてのみ解説を行います。
問題2
GMOペパボのサービスのうち、Swiftを用いた開発を行っているサービスは次のどれですか?
- ロリポップ
- ムームードメイン
- ヘテムル
- minne
問題2の解説
国内最大のハンドメイドマーケット「minne」では、iOSアプリをSwiftを使用したネイティブ開発で作っています。
よって答えは4のminneになります。
minneのiOS開発の技術スタックについて気になった方は少し古いですが、過去のブログをぜひ見てみてください。
問題4
Swiftで整数型のデータを表すためのキーワードは何ですか?
- int
- integer
- Int
- number
問題4の解説
Swiftの整数型は、「Int」です。範囲によっては別の整数型もありますが、この中で該当するのは「Int」のみです。よって答えは3です。
1のintは、モバイルエンジニアに親しい言語だとObjective-CやDartなどで採用されているので混乱したかもしれません。 3のnumberはTypeScriptを書いているとなじみ深い(整数ではない)ですが、他の言語ではあまり見ませんね。
普段コード補完に頼ることも多いと思うので、あらためて問われると難しい問題だったかもしれません。
余談ですが、実は次の5の問題文のソースコードにInt
と記載されていたのでサービス問題になっていました。
問題6
下記の様なコードがあります。Pull To Refresh処理実行時にローディング用Indicatorが表示されるiOSバージョンはいくつですか?
@ObservableObject viewModel: ViewModel = ViewModel()
ScrollView {
LazyVStack(spacing: 0.0) {
// viewModel.itemsを一覧表示する
ForEach(Array(viewModel.items.enumerated()), id: \.offset) { index, item in
// ※ Rowはデータ1件を表示するためのView要素
Row(item: item)
}
}
}
.onAppear {
// 画面が表示された際にviewModel.itemsの取得を試みる
// データが取得できたら、viewModel.itemsにデータが格納される。
viewModel.onAppear()
}
.refreshable {
// viewModel.didRefresh()でPullToRefresh処理を実行
// Indicatorが表示され、読み込み後に更新したデータが表示される
viewModel.didRefresh()
}
- iOS14以降
- iOS15以降
- iOS16以降
- iOS17以降
問題6の解説
こちらの問題はSwiftUIの問題です。
SwiftUIで簡単にPull to Refreshが実装できるmodifierのrefreshableが追加されたのはiOS15からです。
ですが、iOS15での挙動はListとScrollViewで異なります。 iOS15ではListの場合は問題なくrefreshableによるPull to Refreshが動き、またScrollViewでもビルドは通ります。しかしScrollViewの場合はiOS16以降でのみ動作することになります。
よって答えは3のiOS16以降になります。
バージョン間での細かな差異を題材とした、いわゆる「引っ掛け問題」でしたので、2を回答される方も多かった様に思います。
問題8
出力される数字はいくつになるでしょう?
struct ObjectA {
var num = 1
}
var obj1 = ObjectA()
var obj2 = obj1
obj2.num = 8670
class ObjectB {
var num = 1
}
var obj3 = ObjectB()
var obj4 = obj3
obj4.num = 2
print(obj1.num * obj2.num + obj3.num + obj4.num)
- 8672
- 8673
- 8674
- 8675
問題8の解説
structとclassの違いを問う問題です。
順に処理を追っていきます。 obj1にはObjectAのnumの値である1がそのまま格納されます。 structは値型で直接値を持つので、obj2への代入では値のみがobj2に入り、次の行でそのまま代入結果の8670が入ります。
struct ObjectA {
var num = 1
}
var obj1 = ObjectA()
var obj2 = obj1
obj2.num = 8670
一方で、classは参照型で参照を持つので、最後の代入ではobj3とobj4どちらにも2が入ることになります。
class ObjectB {
var num = 1
}
var obj3 = ObjectB()
var obj4 = obj3
obj4.num = 2
よってprintの中の計算は、1 * 8670 + 2 + 2
となり、答えは3になります。
最後に
解説にはありませんが、問題7がUIKitの問題であったのに対し問題6がSwiftUIの問題であったため、どちらか片方しか使っていないと全問正解は難しいような構成になっていました。 一方で4番までの問題は比較的簡単な作りにしていたのと、問題5や問題8などは普段他の言語を書かれている方でも大まかに流れを予測して解けるような問題になっていたので、幅広いみなさんに挑戦していただくことができたと思います。
ブースに寄って問題を解いてくださった皆様ありがとうございました! 問題から始まりさまざまなコミュニケーションが取れて充実した3日間でした。