65
業務でSwift3ヶ月開発してきたので一旦振り返り yidev 18回勉強会 2015/03/07

yidev 第18回勉強会 「業務でSwiftで3ヶ月開発してきたので一旦振り返り」

  • Upload
    -

  • View
    4.508

  • Download
    7

Embed Size (px)

Citation preview

業務でSwiftで3ヶ月開発してきたので一旦振り返り

yidev 第18回勉強会 2015/03/07

自己紹介

- 佐藤俊輔(@ushisantoasobu)

- 株式会社ピースオブケイク

- 元々デザイナーぽいことやっていた、4年前からエンジニア

- iOS歴 1年 + 半年(iOS7が出たころあたりがブランク)

サービス紹介

https://cakes.mu/

サービス紹介

https://note.mu/

今日話すこと

ここ3ヶ月ほど

業務でSwiftでiOS開発してきたので

その振り返り

(iOS7以上、デザイナー1人 / iOS開発1人)

- Swiftで開発してみて

- iOS7, 8での挙動の違いまとめ

- UIとかエンジニア/デザイナー間での作業について

アジェンダ

- Swiftで開発してみて

- iOS7, 8での挙動の違いまとめ

- UIとかエンジニア/デザイナー間での作業について

アジェンダ

- Swiftコーディング規約@Wantedly

- 書籍「詳解 Swift」

- あとは適宜調べる

参考にしたもの

XCodeがまだ不安定..

XCodeがまだ不安定..

- ビルドが遅い

- SourceKitうんちゃら(画像のもの)

- renameのリファクタリングがまだできない

- 他にも、APIの実装がまだだったので、クラスファイル内にテストデー

タとして長い文字列定義したら、ファイルのインデックスがとまったり

XCodeがまだ不安定..

まあ徐々に改善されていくのかなと楽観視

XCodeがまだ不安定..

Swift製のライブラリについて

「Swiftで書くなら、Swift製のライブラリをつかいたい!」みたいな気持ち

Swift製のライブラリについて

Swift製のライブラリについて

Swift製のライブラリについて

- そもそもまだそんなにSwift製のライブラリない

- あっても採用実績少ないのでバグは多分にありそう

- Objcの移植のものでも部分部分で未実装のところもある可能性有

- CocoaPods 0.36 beta?? Carthage??

=> productionなら、しばらくは無理に使う必要ないかなと思ったり

Swift製のライブラリについて

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

- (void)test { int a = 2; CGFloat b = 4.5; CGFloat c; c = a + b; }

Objc

func test() { var a :Int = 2 var b :CGFloat = 4.5 var c :CGFloat = 0.0 c = a + b }

Swift

- (void)test { int a = 2; CGFloat b = 4.5; CGFloat c; c = a + b; }

Objc

func test() { var a :Int = 2 var b :CGFloat = 4.5 var c :CGFloat = 0.0 c = a + b }

Swift

コンパイル通らない

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

- ( c = a + b; }

Objc

func c }

Swift

コンパイル通らない

Swiftだと、数値型の計算は暗黙の型変換は行われない

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

Objc Swift

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

func plot(samples :UnsafePointer<Float32>) { //... for var i = 0; i < sampleCount; i++ { var sample = Float32(samples.memory) samples = samples.successor() //... } //... }

- (void)plotLogGraph:(Float32 *) samples { //... for (NSInteger i = 0; i < sampleCount; i++) { Float32 sample = *samples++; //... } //... }

Objc Swift

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

func plot(samples :UnsafePointer<Float32>) { //... for var i = 0; i < sampleCount; i++ { var sample = Float32(samples.memory) samples = samples.successor() //... } //... }

- (void)plotLogGraph:(Float32 *) samples { //... for (NSInteger i = 0; i < sampleCount; i++) { Float32 sample = *samples++; //... } //... }

Objc Swift

Objcの既存のコードをSwiftに書き換えたときに地味に面倒かったもの

func //... for samples } //... }

- (void //... for } //... }

ポインタまわりに少し戸惑う

archiveコマンド

http://kishikawakatsumi.hatenablog.com/entry/2014/11/02/145255

http://blog.ishkawa.org/2015/01/07/1420556760/

を参考に、

iTunesConnectへのバイナリのアップロードを

自動化しようと目論む

archiveするとなんかファイルが増えてる…

archiveコマンド

https://devforums.apple.com/message/1042117#1042117

問題なくできたかな..と思ったけどこんなスレが

archiveコマンド

コマンドからバイナリを生成したときに、

swiftモジュールが含まれず申請しても

invalidでリジェクトくらう的な内容

archiveコマンド

https://devforums.apple.com/message/1042117#1042117

申請の締め切りも迫っていたので結局XCodeからアップロード > <

archiveコマンド

コマンドからバイナリを生成したときに、

swiftモジュールが含まれず申請しても

invalidでリジェクトくらう的な内容

https://devforums.apple.com/message/1042117#1042117

- Swiftで開発してみて

- iOS7, 8での挙動の違いまとめ

- UIとかエンジニア/デザイナー間での作業について

アジェンダ

AutoLayout + CGAffineTransform

http://stackoverflow.com/questions/26088559/autolayout-cgaffinetransform-ios7-ios8

AutoLayoutを設定したviewに対して

CGAffineTransformのscaleがiOS7だと効かない??

AutoLayout + CGAffineTransform

=>ちょっとした演出のために入れていたものなのでiOS7は切った

AutoLayoutを設定したviewに対して

CGAffineTransformのscaleがiOS7だと効かない??

http://stackoverflow.com/questions/26088559/autolayout-cgaffinetransform-ios7-ios8

カスタムトランジッション

カスタムトランジッションで

画面遷移後にiOS8だと画面が真っ黒になる??

カスタムトランジッション

func pop_animationDidStop(anim: POPAnimation!, finished: Bool) { if self.context!.transitionWasCancelled() { self.context!.completeTransition(false) } else { self.context!.completeTransition(true) if self.isReverse { let to = self.context!.viewControllerForKey(UITransitionContextToViewControllerKey)! as UIViewController UIApplication.sharedApplication().keyWindow?.addSubview(to.view) } } }

http://stackoverflow.com/questions/24338700/from-view-controller-disappears-using-uiviewcontrollercontexttransitioning

ここらへんの処理をいれてあげる

モーダル的な(裏の画面が見えつつ画面を重ねてく)

モーダル表示 さらにそこにモーダル表示

var vc = FirstPresentViewController()   if isSystemVersionLessThan("8.0") { var root = UIApplication.sharedApplication().delegate?.window??.rootViewController root?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext } else { vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen }   self.presentViewController(vc, animated: false, completion: nil)

var vc = SecondPresentViewController()   if isSystemVersionLessThan("8.0") { self.presentedViewController?.modalPresentationStyle = UIModalPresentationStyle.CurrentContext } else { vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen }   self.presentedViewController?.presentViewController(vc, animated: false, completion: nil)

モーダル表示

さらにそこにモーダル表示

モーダル的な(裏の画面が見えつつ画面を重ねてく)

- UIAlertView / UIAlertController => ラッパつくった

- UIActionSheet / UIAlertController => ラッパつくった

- remoteNotificationまわり

- UITableViewCellのボタンがiOS7だと押せない

(contentView.userInteractionEnabled = false)

- 思ったよりもiOS7 / 8で挙動が違うところある所感

- なので当たり前だけど、動作テストはしっかりやる

- そもそもあんま気取ったことはやらないほうが無難??

- やるならハマることもあり得るので見積もりは慎重に

iOS7 / 8挙動の違い まとめ

- Swiftで開発してみて

- iOS7, 8での挙動の違いまとめ

- UIとかエンジニア/デザイナー間での作業について

アジェンダ

iPhone6 / 6 plusが販売されてからはじめての新規開発

iPhone6 / 6 plus さわってみてはじめに出た感想

(主に競合サービスであるコンテンツ系のapps)

戻るがツラい!!!!!!!

左上届かない!!!

エッジスワイプも厳しい!!!

開発前に他のサービスでどうしてるのかみてみた

画面のどこからでもいいので、一定量右にスワイプすると戻る

SmartNews Antenna Gunosy

「エッジスワイプ」の全画面版

Flipboard Instagram

スクロール最上部から下に引っ張る

Siori Groups

All Direction Pull!!

StoreHouse

- 画面のどこからでもいいので、一定量右にスワイプすると戻る

- 「エッジスワイプ」の全画面版

- スクロール最上部から下に引っ張る

- All Direction Pull Back!!

「戻る」の主な対策

- 画面のどこからでもいいので、一定量右にスワイプすると戻る

- 「エッジスワイプ」の全画面版

- スクロール最上部から下に引っ張る

- All Direction Pull Back!!

✔️

今回の開発で採用したもの

車輪の再発明は面倒だったのでライブラリで代用

「戻る」についてのまとめ

- 何かしら対策入れてあげるとユーザビリティ的にはいいかも

- 他のジェスチャと干渉しないよう、設計に気をつけること(大事)

- でもいずれiOS9とかで何か標準実装されたり??

http://qiita.com/ushisantoasobu/items/fb1e7c2672f6ae815109

http://qiita.com/tdksk/items/36d892fca5fcba07f8eb

「戻る」についての参考サイト

はじめてのAutoLayoutを前提とした新規開発

http://ushisantoasobu.hateblo.jp/entry/2015/01/22/104258

ちなみに今回のプロジェクトから

デザイナー/エンジニア間でのワークフローに

“Sketch”を使っている

こんなデザインファイルがきたとする...

このラベルのy座標は固定なのか?

中心点からの距離が固定か?

こんなデザインファイルがきたとする...

こんなデザインファイルがきたとする...

この画像は縦幅が固定なのか?

縦横比が固定なのか?

こんなデザインファイルがきたとする...

- AutoLayout情報込みのカンプをつくる

- 全デバイス毎のデザインを用意して、そこからエンジニアが読み解く

- 直接デザイナーに訊く

- デザイナー自身がXCodeで組み込む

考えられる対策

- AutoLayout情報込みのカンプをつくる

- 全デバイス毎のデザインを用意して、そこからエンジニアが読み解く

- 直接デザイナーに訊く

- デザイナー自身がXCodeで組み込む

✔️

考えられる対策

会社の規模が近い、デザイナーとの席が近い、デザイナーと仲がいい

などの要因があってこれでなんとかできてるけど、

大きな会社だったりデザインを外注するときなんかにはどうしてるのだろう…??

考えられる対策

- AutoLayout情報込みのカンプをつくる

- 全デバイス毎のデザインを用意して、そこからエンジニアが読み解く

- 直接デザイナーに訊く

- デザイナー自身がXCodeで組み込む

✔️

考えられる対策

- AutoLayout情報込みのカンプをつくる

- 全デバイス毎のデザインを用意して、そこからエンジニアが読み解く

- 直接デザイナーに訊く

- デザイナー自身がXCodeで組み込む✔️

現在隣の席のデザイナーに誠意啓蒙中

!

エンジニア募集

https://www.wantedly.com/projects/14842

ご清聴ありがとうございました!!!