SlideShare a Scribd company logo
4年前のカメラアプリを 
Swiftで書き直した 
株式会社トルクス 山田宏道 
2014年11月26日 
主催・会場:株式会社アクロビジョン
自己紹介、会社紹介
自己紹介、会社紹介 
「TAPP」 
「TAPP Manager」 
「OSS Sampler」
自己紹介、会社紹介
4年前のカメラアプリをSwiftで書きなおした
FrameCamera:制作経緯 
• 2009年、iPhone 3GS購入! 
• 「iPhoneアプリ作ってみたい!」 
• 「カメラの上に画像を載せて撮影してみたい!」 
• あわよくば、一攫千金! 
• 2009年末に試作開始。
FrameCamera:リリース 
• 友人にアイコンデザイン頼んだりしつつ、実装 
• 2010年3月3日にリリース!
FrameCamera:Ver.Up 
• 【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:1.4 
• 【1.4】2010/9/2:iOS4対応! 
• iOS SDK 4でビルドした程度 
• iPhone 4(2010年6月発売)には未対応 
• →「Retina、フロントカメラ、フラッシュ」未対応 
• ARC まだ無いので未対応(iOS 5から) 
• AVFoundation?Storyboard?CollectionView?
FrameCamera:夏 
• 2014年6月:Swift登場! 
• 夏の終わり、ちょっと時間ができた! 
• 勉強を兼ねて再作成開始!初Swiftプロジェクト!
FrameCamera:開発 
• 2014年9月2日:作業開始 
• 4日目で大体画像を選んでカメラに合成するところまで完 
了(実質、2人日弱くらい?) 
• 新機能等の調整を含めて、申請まで大体6人日弱 
• 助かった:AVFoundation、UICollectionView、 
Storyboard!という機能群 
• Swift特有の話を続けます
開発方針 
• 「機能はそのまま」を目標に開発をする 
• Storyboard採用 
• カメラの上にフレームを表示する表現 
• これまで:Viewを組み合わせてページングを実装 
• 今なら:AVFoundation+UICollectionView
いきなり結論 
• 自分の知っているコードをSwiftに移植するのは、 
「Swiftを学ぶ」という観点で正解だった! 
(新規プロジェクトで採用するより) 
プログラミング言語 
(Obj-C, Swift) 
SDK 
(iOS SDK) 
Tools 
(Xcode) アルゴリズム
便利 
ヘッダーファイルがない! 
• C/C++/Obj-Cに慣れていると違和感。 
• が、慣れるといい! 
• プロジェクトがすっきりする! 
• 初心者に説明しやすい 
• ソースの見通しが悪くならないように気 
をつけるようになる
便利 
クラス宣言は直感的! 
• 他言語にありがちな形なので、すぐ理解できた
enumは結構違う 
ハマる 
• Objective-Cのenum(NS_ENUM)とはちょっと使 
い勝手が違う。 
• 即値ではない 
使い方を意識して変える必要がある 
• toRaw() で数値等に変換できる 
fromRaw() で数値等から変換できる
enumは結構違う 
便利 
• Obj-C→Swiftの自動変換が素晴らしい! 
NS_ENUM (NSUInteger, MyEnum) { 
MyEnumA, 
MyEnumB, 
MyEnumC, 
}; 
enum MyEnum: Int { 
case A 
case B 
case C 
} 
• SwiftのenumをObjective-Cで使う方法は無い様子 
…
便利 
Obj-Cとの連携は簡単 
• SwiftのプロジェクトにObjective-Cのコードやライブ 
ラリを追加するのは簡単 
• “ProjName-Bridging-Header.h”を作成し、プロジェク 
トに追加する。(Obj-Cのソースを新規で追加しようと 
すると自動で生成してくれる。うまくいかない場合、プ 
ロジェクト設定で指定) 
• 呼び出すObj-Cのヘッダーをimportする文を書くだけ!
困った 
Optional、、、どうなの? 
• Swift最大の問題児!? 
• Swift:変数にnilを入れられない 
• Swift:型が違うと自動で変換してくれない 
• でも、実際それじゃ困る!ということへの対応が 
Optionalという仕組み
困った 
Optional:ステップ1 
• 基本 
var ngName : String = nil // NG!!! 
var myName : String? = nil // OK!!! 
String? .. String OR nil 
var myName : Optional<String> = nil // OK!!! 
「Optionalでwrapされている」状態↑
困った 
Optional:ステップ2 
• メソッド、プロパティを使うときの問題 
var myName : String? = “test” 
var upper = myName.uppercaseString // NG 
String? の型の変数では、String としては使えない 
Unwrapする必要がある↓ 
var upper = myName?.uppercaseString // OK 
// ?の違い、Optional Chaining、Xcodeの入力支援
困った 
Optional:ステップ3 
• OptionalをUnwrapする方法 
// 1. 
if( myName != nil ){ 
var upper = myName!.uppercaseString 
} 
// 2. 
var upper = myName?.uppercaseString 
// ↑この upper の型は?? 
var upper : String? = myName?.uppercaseString 
// myNameがnilの可能性!
困った 
Optional:ステップ4 
• Optional宣言面倒。への対応 
var myName : String! = “test” 
var lower = myName.lowercaseString 
… Implicitly Unwrapped Optional 
// myNameがnilだったら?? 
→実行時エラー
困った 
Optional、、、どうなの? 
• まとめ 
• Optional、ちょっと面倒だけど、、 
• 高速化、実行時の安全のため、と思って… 
ソース 
ビルド 
アプリ実機で実行 
<Optionalの話:おわり>
教訓 
DelegateはProtocol 
• Delegateは、Protocolという同等の機能になる 
• 基本的にメソッドの実装が必要となるが、下記のよ 
うにすれば、optionalなメソッドも定義可能 
@objc protocol MyProtocol { 
optional func funcXXX() -> String 
}
教訓 
無理にStringを使わない 
• String, Dictionary, ArrayはNSString, NSDictionary, 
NSArrayから置き換えられるが、メソッドは使えない。 
• NSString, NSDictionary, NSArrayをそのまま使うほう 
が便利! 
var infoDic : NSDictionary! = NSBundle.mainBundle().infoDictionary as NSDictionary! 
let bundleVersion = infoDic.valueForKey("CFBundleShortVersionString") as NSString!
単語や演算子間の 
スペースが超重要! 
教訓 
• “=“ の前後にスペースを開けないとエラーになること 
があった! 
(最新版のXcode 6.0.1あたりの話)
教訓 
Xcodeは旧バージョンを残す 
• Xcodeをバージョンアップすると、Swiftも変わる。 
• Swiftの文法が変わってビルドできなくなる! 
(実際、何度かありました。。) 
• 1日程度は余裕を持って新バージョンを試しましょう
アップできなかった! 
• Xcode 6.1(の特定ビルド?) でビルドして申請し 
ようとしたら、アップできなかった。。 
詳細: 
http://labs.torques.jp/2014/10/24/3736/ 
「Xcode 6.1が怖い理由 « TORQUES LABS」 
ハマった
教訓 
スクリーンショット準備が大変 
• 画面サイズが増えた。 
• 多言語対応していると、、
おすすめ検索方法 
教訓 
• ググる時に期間指定をする!
4年前のカメラアプリをSwiftで書きなおした
株式会社トルクス 
facebook.com/torques.inc 
↑  
エンジニアの皆さんに有益な情報を流すよう 
努力しますので、 
「いいね!」してもらえると嬉しいです! 
お仕事、開発パートナーも募集中! 
(Oculus, Unity, Arduino, Raspberry Pi等、いろいろ準備中です!)

More Related Content

PDF
AWS Amplify XRを動かしてみたら、、、
PDF
RMShapedImageview
PDF
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
PDF
AVFoundationを使った無音カメラアプリの作り方
PPTX
STYLYって何?
PPTX
息抜きにUnityであそぼう(3D Game Kit Liteの話)
PDF
FMETP Streamの使い方メモ
PDF
Shader Graphを使う
AWS Amplify XRを動かしてみたら、、、
RMShapedImageview
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
AVFoundationを使った無音カメラアプリの作り方
STYLYって何?
息抜きにUnityであそぼう(3D Game Kit Liteの話)
FMETP Streamの使い方メモ
Shader Graphを使う

More from Hiromichi Yamada (11)

PPTX
Project PLATEAU について調べたまとめ
PDF
はじめての Magic Leap 1 コンテンツ開発
PPTX
Unityで作るオリジナルウェブカメラ
PDF
SMCN05 - AR! AR! AR!
PDF
SMCN #03 Oculus Quest と VRコンテンツを知ろう
PDF
UnityでつくるVRアプリ 〜VRの作法とVRTK〜
PDF
【地域おこしVR研究会】第1回勉強会「VR業界動向とコンテンツ制作入門」
PDF
子どもがOculusダメな理由を調べてみた
PDF
Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13
PDF
Oculus 体験・勉強会「VRコンテンツ制作入門」
Project PLATEAU について調べたまとめ
はじめての Magic Leap 1 コンテンツ開発
Unityで作るオリジナルウェブカメラ
SMCN05 - AR! AR! AR!
SMCN #03 Oculus Quest と VRコンテンツを知ろう
UnityでつくるVRアプリ 〜VRの作法とVRTK〜
【地域おこしVR研究会】第1回勉強会「VR業界動向とコンテンツ制作入門」
子どもがOculusダメな理由を調べてみた
Oculus 体験・勉強会「VRコンテンツ制作入門」 2015/05/13
Oculus 体験・勉強会「VRコンテンツ制作入門」
Ad

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