iOS iOSDC イベント

iOSDC Japan 2023のビンゴ問題を解説します

iOS iOSDC イベント

こんにちは!yagijinです。

iOSDC Japan 2023にてGMOインターネットグループのブースで、iOSやサービスにまつわる問題を解いてマスを埋めるビンゴ企画を行いました。 いくつかの問題は、社内のモバイルエンジニアで作成したので、本ブログではその解説をします。

問題も載せているので当日参加されなかった方もぜひ挑戦してみてください!

問題と解説

今回は、ペパボが担当した問題についてのみ解説を行います。

問題2

GMOペパボのサービスのうち、Swiftを用いた開発を行っているサービスは次のどれですか?

  1. ロリポップ
  2. ムームードメイン
  3. ヘテムル
  4. minne

問題2の解説

国内最大のハンドメイドマーケット「minne」では、iOSアプリをSwiftを使用したネイティブ開発で作っています。

よって答えは4のminneになります。

minneのiOS開発の技術スタックについて気になった方は少し古いですが、過去のブログをぜひ見てみてください。

問題4

Swiftで整数型のデータを表すためのキーワードは何ですか?

  1. int
  2. integer
  3. Int
  4. 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()
}
  1. iOS14以降
  2. iOS15以降
  3. iOS16以降
  4. 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)
  1. 8672
  2. 8673
  3. 8674
  4. 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日間でした。