MIXIはtry! Swift Tokyo 2024にブース出展しました!出題したiOSクイズとブースをご紹介します
こんにちは。MIXIのDevRelのChihappyです。
2024年3月22日(金)〜24日(日)に開催された try! Swift Tokyo 2024 にて、MIXI はPLATINUMスポンサーとして協賛いたしました。
MIXIのブースでは、1日目、2日目ともにエンジニアが考えた「iOSクイズ」を実施し、2日間の合計で、397名の方にご回答いただきました。ブースに遊びに来てくださったみなさま、ありがとうございました!!
本記事では、出題したクイズの解答と解説および正答数の分布、そして当日のMIXIブースの様子をご紹介させていただきます。
クイズ(1日目)
1問目
Swift5.10の次に予定されているバージョンは、次のうちどれでしょう?
選択肢
- Swift5.11
- Swift5.10.1
- Swift6
- Swift5.11RC
正解:「Swift6」
解説:Swift5.10のリリースノートに次はSwift6を予定しているという記載があります。
https://www.swift.org/blog/swift-5.10-released/
2問目
Swift 5.9では以下のコードの結果はどうなりますか?
var number = 1
print(++number)
選択肢
- 1が出力される
- 2が出力される
- コンパイルエラーが発生する
正解:「コンパイルエラーが発生する」
解説:Swift3 でインクリメント / デクリメントは削除されました。
Swift Evolution Proposal SE-0004
error: repl.swift:14:7: error: cannot find operator '++' in scope; did you mean '+= 1'?
print(++number)
^~
3問目
期待通りの出力になるように空欄を埋めてください。
let numbers = [1, 2, 3, nil, 4, 5]
numbers.[???] // [1, 4, 9, 16, 25]
選択肢
- map { $0 * $0 }
- map { number in number * number }
- filter { $0 != nil }
- compactMap { $0 }.map { $0 * $0 }
正解:「compactMap { $0 }.map { $0 * $0 }」
解説:numbers の型は[Int?]です。nil に対して四則演算を行うことはできないため、compactMap で nil を取り除いてから演算を行う必要があります。
4問目
SwiftにおけるUInt8型が取り得る最大の値はいくつでしょう?
選択肢
- 255
- 256
正解:「255」
解説:Swift の UInt8型は符号なし8ビット整数であり、0から255までの整数を格納できます。
5問目
以下のようなProtocolのデフォルト実装がされている時、出力される結果として正しいのはどれですか?
protocol TotoProtocol{
func foo()
}
extension TotoProtocol {
func bar() {
print("bar() - Protocol")
}
}
class TotoClass: TotoProtocol {
func foo() {
print("foo() - Class")
}
func bar() {
print("bar() - Class")
}
}
let toto: TotoProtocol = TotoClass()
toto.foo()
toto.bar()
選択肢
- foo() — Class, bar() — Protocol
- foo() — Class, bar() — Class
正解:「foo() — Class, bar() — Protocol」
解説:bar()メソッドはプロトコル拡張で提供されており、TotoClass でも実装されています。しかし、変数 toto は TotoProtocol 型であり、プロトコル型の変数を通してプロトコル拡張のメソッドを呼び出すと、型に関連付けられた実装ではなく、プロトコル拡張にある既定の実装が使用されます。
6問目
メソッドのどこにもに付与できないアトリビュートは、次のうちどれでしょう?
選択肢
- @objc
- @IBInspectable
- @escaping
- @inlinable
正解:正解は「@IBInspectable」
解説:@IBInspectable のみプロパティに付与するアトリビュートで、Interface Builder(Storyboard, Xib)を使ったUIを実装する際に利用できます。
7問目
Swift2.xからSwift3.xへのバージョンアップで起こった変化は、次のうちどれでしょう?
選択肢
- fileprivate導入
- guard
- enumの頭文字が小文字
- Codable
正解:「enumの頭文字が小文字」と「fileprivate導入」
解説:『guard』はSwift2、『Codable』はSwift4になります。
クイズ(2日目)
1問目
以下のコードのコンパイル結果はどうなりますか?
let tooBig: Int8 = 128
選択肢
- 正常にコンパイルできる
- コンパイルエラーが発生する
正解:「コンパイルエラーが発生する」
解説:SwiftのUInt8型は符号なし8ビット整数であり、-128から127までの整数を格納できます。Arithmetic operation ‘127 + 1’ (on type ‘Int8’) results in an overflowが表示されます。
2問目
Swiftの正しい構文になるように、空欄を埋めてください。
//定数宣言
( ① )hoge ( ② )String = "hoge"
//メソッド定義
( ③ )fuga() ( ④ )String { return "fuga" }
選択肢
- ①let ②: ③func ④->
- ①val ②: ③fun ④:
- ①let ②: ③function ④:
- ①val ②-> ③fun ④->
正解:「①let ②: ③func ④->」
解説:2番目はKotlin、3番目はTypeScript、4番目は架空の言語になります。
3問目
MediaPlayer Package の中にMediaConfiguration Module, MusicPlayer Module を定義しました。 MediaClient#get(_:) を App Target からは呼び出せないが、MediaPlayer Package の中では参照できるようにするとき、(???) には何を入れる必要があるでしょうか?
// Module `MediaConfiguration` in `MediaPlayer`
public class MediaClient {
public init() {}
[???] func get(_ url: URL) -> Data {…}
}
// Module `MusicPlayer` in `MediaPlayer`
import Foundation
import MediaConfiguration
public class MusicPlayer {
let client = MediaClient()
public init() {}
public func play(_ url: URL) {
let data = client.get(url)
// Play music based on the Data object
}
}
// App
import Foundation
import MediaConfiguration
import MusicPlayer
let url = URL(string: "…")!
MusicPlayer().play(url) // can access `play` since it's a public symbol
MediaClient().get(url) // 'get' is inaccessible
選択肢
- open
- package
- private
- package(private)
正解:「package」
解説:
package はSwift5.9、SE-0386で導入されました。
・open を使用するとMediaClient#get(_:) を App Targetから呼び出せてしまいます
・MediaDecoder などを private で宣言すると、MusicPlayer module からはもちろん、MediaConfiguration module 内の別のファイルからも参照できなくなります。
・package(private) は Swift5.9現在存在しませんが、将来packageopen、open(package)、package(override)などが導入される可能性があることが示唆されています。
4問目
Swift5.5 で iOS15以降で使える Swift Concurrency が登場し、その後 iOS13 以降で使えるようになりましたが、iOS13 で使用可能な条件はどれですか?
選択肢
- Xcode13.0
- Xcode13.2
- Swift5.6
正解:「Xcode13.2」
解説:Swift Concurrency は Xcode13.2 で iOS13まで拡張されましたhttps://developer.apple.com/documentation/xcode-release-notes/xcode-13_2-release-notes#Swift
5問目
以下のコードの結果はどうなりますか?
class Person {
var name: String
init(name: String) {
self.name = name
}
}
let firstPerson = Person(name: "Alice")
let secondPerson = firstPerson
secondPerson.name = "Bob"
print("First: \(firstPerson.name), Second: \(secondPerson.name)")
選択肢
- First: Alice, Second: Alice
- First: Alice, Second: Bob
- First: Bob, Second: Alice
- First: Bob, Second: Bob
正解:「First: Bob, Second: Bob」
解説:クラスのインスタンスである firstPerson と secondPerson は、同じ参照を共有しています。secondPerson.name を変更すると、同じインスタンスの firstPerson.name も変更されるため、両方の name プロパティには “Bob” が格納されます。
6問目
以下のコードに使われているマクロの種類で正しいのは、次のうちどれでしょう?
func myFunction() {
print("Currently running \(#function)")
#warning("Something's wrong")
}
選択肢
- Freestanding Macros
- Attached Macros
正解:「Freestanding Macros」
解説:Freestanding Macros は#から始まり、クラス等の宣言に付与されることなく単独で使用します。Attached Macros は@から始まり、付与されたクラス等の宣言に対してコードを生成します。
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/macros/
MIXIブースのレポート
ここからは、当日のMIXIブースの様子について簡単にご紹介します。
まず、MIXIブースの場所はコーヒー☕などを提供しているブレイクエリアでした。
iOSクイズの出題
ブースでは、前述のiOSクイズを出題し、日本語版と英語版の2種類を用意しました。
クイズの正答数の分布は下記となります。中央値は2日間ともに4点となりました。
1日目は5問以上正解、2日目は4問以上正解でノベルティをプレゼントしていたのですが、両日ともに3,4,5点に分布が集中しており、ギリギリでノベルティをお渡しできなかった方も大勢いらっしゃったのではないかと思います。
1日目に惜しくも正答数が足りなかった方が2日目にリベンジしてくださり、無事ノベルティをゲットされることもありました。楽しんでいただけたようで、とてもうれしかったです🙌
1日目(日本語版)回答数の合計:144件
1日目(英語版)回答数の合計:90件
2日目(日本語版)回答数の合計:106件
2日目(英語版)回答数の合計:57件
ノベルティ
クイズの成績が良かった方にはノベルティとして、Swiftに関連付けて「値型」タオルをプレゼント🎁海外の方も多いので、何か日本らしいものを…と思い漢字でデザインしました。こちらもエンジニアにアイディアを出してもらい、余談ですが、他にも「並行処理」や「拡張」などの案も出ていました。
ブースづくりに協力してくれたMIXI ENGINEERS
最後に、今回ブースのコンテンツおよびノベルティ作成を中心となって進めてくれたMIXI ENGINEERSをパシャリ📸📸
・・・
MIXIでは様々な事業やポジションで仲間を募集中です。
こちらの記事を読んでいただき、MIXIで働くことに興味を持ってくださった方がいましたら、ぜひ採用情報をご覧ください。MIXIエンジニアの公式X(旧:Twitter)でもMIXIで扱う技術やエンジニアに関する情報など、随時発信してますので、フォローしていただけると幸いです。
それでは、最後までお読みいただき、ありがとうございました!