SlideShare a Scribd company logo
業務で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
ご清聴ありがとうございました!!!

More Related Content

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