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