potatotips #49 (iOS/Android開発Tips共有会) に参加しました

こんにちは!

@cosmeアプリや@cosme PROアプリのiOS開発をしているaboyです。

potatotips #49 (iOS/Android開発Tips共有会)にiOSブログ枠として参加しました。

発表内容の詳細はスライドを見ていただければいいので、所感など書いていきます。

XCTestを目的別で分けるすすめ

twitter: @gaopin1534

※スライドの内容はフィクションだそうです

自動テストはコケてるしテストの成功/失敗がスプリントに依存してしまっていた案件(仮)に参加してツラかったので、テストターゲットを適切に分割しようねというお話

この話はあくまでフィクションとのことですが、弊社でもがっつりテストを書けているわけではなく、また現状でもプロジェクトがじゅうぶん巨大なため、この発表で紹介されたような状態になりうる可能性があり、危機感を感じました。。。

挫折しないiOS勉強会

github: Akio Itaya
github: 今回のリポジトリ

初心者にとってつまずきそうな難しい実装部分を継承で隠すことで最初のハードルを低く設定して触ってもらい、その後マジックの種明かしのように裏で何が起きているのかを紐解いていく、という手法を実践されているとのことでした。

仕事でiOS開発をしていると、学ぶ順序として

  1. リスト表示
  2. APIからデータを取ってきてリスト表示
  3. リストをタップするとデータを詳細画面に渡しつつ遷移…

みたいな感じの順序をぼくは思い浮かべますが、プログラミング初心者にとってはコードをたくさん書くことそのものがハードルでしょうし、それに比べてAkkeyLabさんが紹介した方法は圧倒的にハードルが低く、面白いアプローチだなと思いました!

せっかくSwiftですし、extensionだけでなくProtocolも使ってみるとなお良さそうですね。

AppStore予約注文を使ってみた

twitter: @toshinarin

メルチャリのiOSアプリリリース時にAppStoreの予約注文機能を使ってみたというお話。

実際に予約注文を使ってみた系のtipsははじめて聞いたのですが、マーケター・ユーザー・開発者がwinwinwinになる素敵機能だと思いました!

アプリの知見が少ない会社だと、こういったAppStore(iTunes Connect)の機能はエンジニア側からディレクターなどに教えてあげないとなかなか気づかないでしょうし、しっかりキャッチアップしないとなーと感じました。

Swiftバグレポートレポート

twitter: @kazuhiro494949

https://bugs.swift.org でパブリックに議論されているSwiftのバグのうち身近なバグを3つ紹介してくださいました。

この発表のあとbugs.swift.orgを見に行ってみたのですが、まずそもそもswiftのバグ管理にはjiraも使われているんですねー。ディスカッションを見ててビックリしたのはこれでしょうか。とくに foo { print($2) } がエラーにならないのが気持ち悪いポイントです…。

func foo(_ closure:(Int, Int, Int) -> Void) {
    closure(1, 2, 3)
}

foo { print($0) } // エラー
foo { print($1) } // エラー
foo { print($2) } // OK
foo { print($0, $1) } // エラー
foo { print($0, $1, $2) } // OK

ReactiveSwiftに習うCollectionの最適化

twitter: @ra1028fe5

SwiftにおけるCollectionのパフォーマンス改善のお話。アプローチが本格的だなーと思って聞いていました。

ContiguousArrayは聞いたことがなかったのでとても勉強になりました。Appleによると

If your array’s Element type is a class or @objc protocol and you do not need to bridge the array to NSArray or pass the array to Objective-C APIs, using ContiguousArray may be more efficient and have more predictable performance than Array.

だそうです。参照型を配列に突っ込みたい場合はContiguousArrayの使用を検討してよさそうですね。

ちなみにこのへんを調べていてclassとstructって本当に速さ変わるの?と思ったのでPlaygroundで雑に実験したところ、本当にstructのほうが速かったです。

import Foundation

class SampleClass {}
struct SampleStruct {}

func testClass() {
    var array: Array<SampleClass> = []
    for _ in 0..<500 {
        let sample = SampleClass()
        array.append(sample)
    }
}

func testStruct() {
    var array: Array<SampleStruct> = []
    for _ in 0..<500 {
        let sample = SampleStruct()
        array.append(sample)
    }
}

let start1 = Date()
testClass()
Date().timeIntervalSince(start1) // classは2.4s前後

let start2 = Date()
testStruct()
Date().timeIntervalSince(start2) // structは2.0s前後

参考: Value and Reference Types

独自Documentクラス @m_yukio

twitter: @m_yukio

誰もが「あれ、イベントの宣伝で時間を使い切ってしまうのでは?」と思う勢いでスタートしつつも古典的なMVCとCocoaのMVCの違いやDocumentについて、自身の反省などを踏まえながらわかりやすくお話してくださいました。

UITableViewControllerの利点を最大限に使う @kurotyann9696

twitter: @kurotyann9696

UIViewController+UITableViewではなくUITableViewControllerを使う利点をわかりやすく説明してくださいました。

たしかにContainerViewを使うとUITableViewControllerでも複雑なUIが実現可能で、弊社でも画面の一部に固定されたボタンを置きたい場合などで使用しています。

Introduction to LLVMSwift @kitasuke

twitter: @kitasuke

LLVMはCで書かれているので読みづらいけど、LLVMSwiftならSwiftで書かれているのでみんな読めますよ!というお話。

https://github.com/llvm-swift/LLVMSwift

普段あまり気にしないレイヤーですが、こうやってSwiftで書いて読めるようにしてオープンソースにしてくれる方々に感謝ですね。

おわりに

今回のpotatotipsですが、Androidの枠でFlutterに関する発表が2つもあって今っぽい感じでしたし、本物のポテトチップスをつまみながら参加者の方々と交流できたりして、とても楽しかったです!

iOSの発表枠はいつも倍率が高いのですが次回は発表したいです。

iOSエンジニア、新卒入社4年目 社内腕相撲大会で優勝しました Flutterが趣味