33
4年前のカメラアプリを Swiftで書き直した 株式会社トルクス 山田宏道 2014年11月26日 主催・会場:株式会社アクロビジョン

4年前のカメラアプリをSwiftで書きなおした

Embed Size (px)

Citation preview

Page 1: 4年前のカメラアプリをSwiftで書きなおした

4年前のカメラアプリを Swiftで書き直した

株式会社トルクス 山田宏道

2014年11月26日 主催・会場:株式会社アクロビジョン

Page 2: 4年前のカメラアプリをSwiftで書きなおした

自己紹介、会社紹介

Page 3: 4年前のカメラアプリをSwiftで書きなおした

自己紹介、会社紹介

「TAPP」 「TAPP Manager」

「OSS Sampler」

Page 4: 4年前のカメラアプリをSwiftで書きなおした

自己紹介、会社紹介

Page 5: 4年前のカメラアプリをSwiftで書きなおした
Page 6: 4年前のカメラアプリをSwiftで書きなおした

• 2009年、iPhone 3GS購入!

• 「iPhoneアプリ作ってみたい!」

• 「カメラの上に画像を載せて撮影してみたい!」

• あわよくば、一攫千金!

• 2009年末に試作開始。

FrameCamera:制作経緯

Page 7: 4年前のカメラアプリをSwiftで書きなおした

• 友人にアイコンデザイン頼んだりしつつ、実装

• 2010年3月3日にリリース!

FrameCamera:リリース

Page 8: 4年前のカメラアプリをSwiftで書きなおした

• 【1.0】2010/3/3

• 【1.1】2010/3/18

• 【1.2】2010/3/29 :Twitter投稿対応(Twitpic)

• 【1.3】2010/7/13

• 【1.4】2010/9/2:iOS4対応!

• ~ 4年間放置!

FrameCamera:Ver.Up

Page 9: 4年前のカメラアプリをSwiftで書きなおした

• 【1.4】2010/9/2:iOS4対応!

• iOS SDK 4でビルドした程度

• iPhone 4(2010年6月発売)には未対応

• →「Retina、フロントカメラ、フラッシュ」未対応

• ARC まだ無いので未対応(iOS 5から)

• AVFoundation?Storyboard?CollectionView?

FrameCamera:1.4

Page 10: 4年前のカメラアプリをSwiftで書きなおした

• 2014年6月:Swift登場!

• 夏の終わり、ちょっと時間ができた!

• 勉強を兼ねて再作成開始!初Swiftプロジェクト!

FrameCamera:夏

Page 11: 4年前のカメラアプリをSwiftで書きなおした

• 2014年9月2日:作業開始

• 4日目で大体画像を選んでカメラに合成するところまで完了(実質、2人日弱くらい?)

• 新機能等の調整を含めて、申請まで大体6人日弱

• 助かった:AVFoundation、UICollectionView、Storyboard!という機能群

• Swift特有の話を続けます

FrameCamera:開発

Page 12: 4年前のカメラアプリをSwiftで書きなおした

• 「機能はそのまま」を目標に開発をする

• Storyboard採用

• カメラの上にフレームを表示する表現

• これまで:Viewを組み合わせてページングを実装

• 今なら:AVFoundation+UICollectionView

開発方針

Page 13: 4年前のカメラアプリをSwiftで書きなおした

• 自分の知っているコードをSwiftに移植するのは、「Swiftを学ぶ」という観点で正解だった! (新規プロジェクトで採用するより)

いきなり結論

プログラミング言語 (Obj-C, Swift)

SDK (iOS SDK)

Tools (Xcode) アルゴリズム

Page 14: 4年前のカメラアプリをSwiftで書きなおした

• C/C++/Obj-Cに慣れていると違和感。

• が、慣れるといい!

• プロジェクトがすっきりする!

• 初心者に説明しやすい

• ソースの見通しが悪くならないように気をつけるようになる

ヘッダーファイルがない!便利

Page 15: 4年前のカメラアプリをSwiftで書きなおした

• 他言語にありがちな形なので、すぐ理解できた

クラス宣言は直感的!便利

Page 16: 4年前のカメラアプリをSwiftで書きなおした

• Objective-Cのenum(NS_ENUM)とはちょっと使い勝手が違う。

• 即値ではない使い方を意識して変える必要がある

• toRaw() で数値等に変換できるfromRaw() で数値等から変換できる

enumは結構違うハマる

Page 17: 4年前のカメラアプリをSwiftで書きなおした

• SwiftのenumをObjective-Cで使う方法は無い様子…

enumは結構違う• Obj-C→Swiftの自動変換が素晴らしい!

NS_ENUM (NSUInteger, MyEnum) { MyEnumA, MyEnumB, MyEnumC, };

enum MyEnum: Int { case A case B case C }

便利

Page 18: 4年前のカメラアプリをSwiftで書きなおした

• SwiftのプロジェクトにObjective-Cのコードやライブラリを追加するのは簡単

• “ProjName-Bridging-Header.h”を作成し、プロジェクトに追加する。(Obj-Cのソースを新規で追加しようとすると自動で生成してくれる。うまくいかない場合、プロジェクト設定で指定)

• 呼び出すObj-Cのヘッダーをimportする文を書くだけ!

Obj-Cとの連携は簡単便利

Page 19: 4年前のカメラアプリをSwiftで書きなおした

• Swift最大の問題児!?

• Swift:変数にnilを入れられない

• Swift:型が違うと自動で変換してくれない

• でも、実際それじゃ困る!ということへの対応がOptionalという仕組み

Optional、、、どうなの?困った

Page 20: 4年前のカメラアプリをSwiftで書きなおした

Optional:ステップ1困った

var ngName : String = nil // NG!!!

var myName : String? = nil // OK!!!

String? .. String OR nil

• 基本

var myName : Optional<String> = nil // OK!!!

「Optionalでwrapされている」状態↑

Page 21: 4年前のカメラアプリをSwiftで書きなおした

Optional:ステップ2困った

var myName : String? = “test”

var upper = myName.uppercaseString // NG

String? の型の変数では、String としては使えない Unwrapする必要がある↓

• メソッド、プロパティを使うときの問題

var upper = myName?.uppercaseString // OK

// ?の違い、Optional Chaining、Xcodeの入力支援

Page 22: 4年前のカメラアプリをSwiftで書きなおした

Optional:ステップ3困った

// 2. var upper = myName?.uppercaseString

• OptionalをUnwrapする方法

var upper : String? = myName?.uppercaseString // myNameがnilの可能性!

// 1. if( myName != nil ){ var upper = myName!.uppercaseString }

// ↑この upper の型は??

Page 23: 4年前のカメラアプリをSwiftで書きなおした

Optional:ステップ4困った

var myName : String! = “test”

var lower = myName.lowercaseString

… Implicitly Unwrapped Optional

• Optional宣言面倒。への対応

// myNameがnilだったら?? →実行時エラー

Page 24: 4年前のカメラアプリをSwiftで書きなおした

• まとめ

• Optional、ちょっと面倒だけど、、

• 高速化、実行時の安全のため、と思って…

Optional、、、どうなの?困った

ソース

ビルド

アプリ 実機で実行<Optionalの話:おわり>

Page 25: 4年前のカメラアプリをSwiftで書きなおした

• Delegateは、Protocolという同等の機能になる

• 基本的にメソッドの実装が必要となるが、下記のようにすれば、optionalなメソッドも定義可能

DelegateはProtocol教訓

@objc protocol MyProtocol { optional func funcXXX() -> String }

Page 26: 4年前のカメラアプリをSwiftで書きなおした

• String, Dictionary, ArrayはNSString, NSDictionary, NSArrayから置き換えられるが、メソッドは使えない。

• NSString, NSDictionary, NSArrayをそのまま使うほうが便利!

無理にStringを使わない

var infoDic : NSDictionary! = NSBundle.mainBundle().infoDictionary as NSDictionary!

let bundleVersion = infoDic.valueForKey("CFBundleShortVersionString") as NSString!

教訓

Page 27: 4年前のカメラアプリをSwiftで書きなおした

• “=“ の前後にスペースを開けないとエラーになることがあった!(最新版のXcode 6.0.1あたりの話)

単語や演算子間の スペースが超重要!

教訓

Page 28: 4年前のカメラアプリをSwiftで書きなおした

• Xcodeをバージョンアップすると、Swiftも変わる。

• Swiftの文法が変わってビルドできなくなる! (実際、何度かありました。。)

• 1日程度は余裕を持って新バージョンを試しましょう

Xcodeは旧バージョンを残す教訓

Page 29: 4年前のカメラアプリをSwiftで書きなおした

• Xcode 6.1(の特定ビルド?) でビルドして申請しようとしたら、アップできなかった。。

アップできなかった!

詳細: http://labs.torques.jp/2014/10/24/3736/ 「Xcode 6.1が怖い理由 « TORQUES LABS」

ハマった

Page 30: 4年前のカメラアプリをSwiftで書きなおした

• 画面サイズが増えた。

• 多言語対応していると、、

スクリーンショット準備が大変教訓

Page 31: 4年前のカメラアプリをSwiftで書きなおした

• ググる時に期間指定をする!

おすすめ検索方法教訓

Page 32: 4年前のカメラアプリをSwiftで書きなおした
Page 33: 4年前のカメラアプリをSwiftで書きなおした

株式会社トルクスfacebook.com/torques.inc

↑  エンジニアの皆さんに有益な情報を流すよう

努力しますので、 「いいね!」してもらえると嬉しいです!

お仕事、開発パートナーも募集中!(Oculus, Unity, Arduino, Raspberry Pi等、いろいろ準備中です!)