potatotips #52 (iOS/Android開発Tips共有会) 参加レポート [iOS]
potatotips #52に参加してきました。
togetter はこちら
2018/6/21 #potatotips (iOS/Android開発Tips共有会) 第52回 - Togetter
発表数も多く長時間になる中、内容の聞き起こしを上げ続ける niwatako さん、すごいです。
ここでは主に iOS の発表の資料と概要をまとめます。
WWDCのセッションから、パスワードのAutofillの紹介
kishikawakatsumi さん
- パスワードの自動生成
- SMS からのオートフィル
- アプリでもできるようになった
- 例
- 認証コードが SMS に送られてきてそれを入力して先に進む画面にいる
- 認証コードのメッセージを受け取る
- 受け取った認証コードがサジェストされて Text field に入力できる (メッセージアプリに移動しなくても良い)
- アプリでどう対応すれば良いか
- Associated Domain を設定する
- Text field の Content type を UserName か Password に設定しておくとログイン画面だと認識されるようになる
- Keyboard type によってサジェストされるものが異なってくる
- パスワードのルールが提供されているものに合わない場合
- Password Rules Validation Tool - Apple Developer でルールを生成
- 上記を TextField に設定する
How to Manage Edge Gestures
TachibanaKaoru さん
- 画面の端からのジェスチャーは system に取られてしまうこと多い
- ノーティフィケーションセンター、コントロールセンターとか出てくる
- iOS11 から system のジェスチャーを阻害することができる設定がつけられる
preferredScreenEdgesDeferringSystemGestures
- 一回だけブロックできる。もう一度続けてスワイプされたら通常通り system の操作が実行される
- 標準の動作を変えることは明確な意図がないと行うべきではないけれど有用な場面はありそう
- 例えば、ゲームでの誤操作を防ぐなど
enum as Option
r_plus さん
- OptionSet と enum それぞれで実装したときどうなるか
- 表面上同じことを表現できる部分もあるけど、性質の違うものなので表現する対象によって使い分けると良さそう
GDPRについて
Yoichi Tagaya さん
- General Data Protection Regulation の略
- 「ヨーロッパの住民の個人情報を適切に扱ってね」って要件
- 2018/5/25 から適用 (すでに施行されてる)
- レギュレーション破ると大きな罰金が課せられる
- 対象者は EEA(European Economic Area) 圏内のユーザ => EEA に拠点がない会社も対象
- アプリでユーザのログとってることが多いが、ユーザの同意を得てない状態で User name, ID, email, IP address などがログに含まれてると危険
Turi Createを試してみる
tattn さん
- Turi Create: Apple がメンテしてる OSS の機械学習モデルの作成ツール
- CoreML のモデルを出力できる
- 用途によって調整済のパラメータ, アルゴリズムが提供されているので機械学習に詳しくなくても気軽に使える
- モデルの学習に結構時間がかかる + 途中状態を保存できない ので注意 (時間に余裕を持って実行しよう)
見落としがちなVoiceOver対応
jkatayama さん
- VoiceOver: 画面上のものを読み上げる機能
- 特に気にしなくても対応できてる部分はある
- UILabel だと text が読まれる
- UIButton だと label.text が読まれる
- 気にしないといけないケース
- ImageView -> 画像ファイル名が読まれてしまう
- テキストなしの Button -> 画像ファイル名が読まれてしまう
- Accessibility Label を設定しよう
Contributing to Swift in WWDC
kitasuke さん
(Slide 見つからず…!)
- WWDC 中にある Swift open hours に行った
- わりと空いてる
- WWDC 中にコンパイラにコントリビュートした
- 手順
- バグっぽいとこを見つける
- バグか聞く
- こういう風に直して良い?と聞く
- 方針を間違えたまま進めると PR 出してからのレビューでごたごたしてしまう
- try!swift work shop で直した
Video decode on iOS
noppe さん
- 透過動画再生ライブラリ作った github.com
- 今回はビデオのデコード部分の話
- ビデオファイルの中身
- メディアコンテナの集まり
- 動画、音声、字幕などが入っている
- ビデオファイルのデコード
- メディアコンテナを再生できる形に復元
- OS/端末のデコーダを利用
- 同じ mp4 でもコーデックが違うとサポート状況が異なる場合がある
- サポートしてるコーデックは Apple 公式サイトに書いてある
- 対応するコーデックの情報をとるメソッドは見つからなかった
- AVAssetReader, VTDecompressionSession
Swiftで高カインド多相
inamiy さん
- 高カインド多相
- 型コンストラクタを受け取って型が作れる
- Kotlin では対応してるライブラリがある (GitHub - arrow-kt/arrow: Functional companion to Kotlin's Standard Library)
- Swift では対応していない
- Swift5 でも対応しなさそう
- swift/GenericsManifesto.md at master · apple/swift · GitHub にも実装に対して消極的な記述
- ライブラリ作った (Swift 製) github.com
少なくとも私にとっては前提が難しかったので、理解できた範囲でですが補足します。
型コンストラクタ
型を引数として受け取り型が生成される関数です。
例えば、「Optional
は型を引数として受け取ることで型を作れる」つまり「型コンストラクタ」として見ることができます。
Optional
は Int
を渡して Optional<Int>
型ができ、String
を渡して Optional<String>
ができるという考え方ができます。
Optional
の他にも、Array
なども同様に捉えられます。
カインド
値の世界では下記のようなコードの :
の左側に宣言してあるものは型を示していますが
let v: Int let f: (Int) -> Int
型の世界で考えたとき、その部分はカインドを示しています
Int: * Optional: (*) -> * Array: (*) -> *
高カインド多相
以上を踏まえつつ、スライド中の高カインド多相の例を見てみます。
class Functor f where fmap :: (a -> b) -> fa -> fb
これは例えば下記のように使えるはずです。
fmap (+1) Optional(2) // -> Optional(3) (!!: 擬似コード)
型に注目すると
fmap :: (a -> b) -> fa -> fb fmap (Int -> Int) -> Optional<Int> -> Optional<Int> a は Int b は Int f は Optional fa は Optional<int> fb は Optional<int>
f
は型コンストラクタとしての Optional
です。
例では Optional
ですが f
は抽象化されているので他の型コンストラクタを与えても適応できます。
fmap (+1) [1, 2] // -> [2, 3] // fmap (Int -> Int) -> Array<Int> -> Array<Int>
しかし、これを Swift で実現しようとすると簡単にはできません。
f = Optional
ということはできず、Optinal<String>
など型パラメータが定まっていなければ指定できないためです。
ではこのような機能をどう実現するか、という発表でした。