SlideShare a Scribd company logo
Swi$%1.2からSwi$%2への移行
@ikesyo
第62回#Cocoa勉強会関西,#2015,07,11#Sat
#cocoa_kansai
@ikesyo
いけしょー/池田翔
京都でフリーランスのiOSエンジニア
(時々Android)しています
現在はフリュー㈱のモバイル開発の
チームにジョイン中。
Swi$/Reac*veCocoaで書いています。
Swift 1.2からSwift 2への移行 #cocoa_kansai
Reac%veCocoa/Carthageの
コミッター(Collaborator)やってます2✨
今日はSwi$%1.2からSwi$%2への移行を
どうやって楽にするか、準備するかを考えます。
概要
• !"Convert(to(Latest(Swi/(Syntax
• ""事前に差分を吸収する
• #"新機能/新構文を利用する
1.#Convert#to#Latest#Swi1#Syntax
変更される点の例
• count(String)"=>"String.characters.count
• グローバル関数"=>"Protocol"extensionsのメソッドへの置き換え
• プロトコル名の変更:
Printable"=>"CustomStringConvertible,
DebugPrintable"=>"CustonDebugStringConvertible
• 関数の引数ラベルの修正(メソッドとのルールの統一)
• toString()"=>"Stringのイニシャライザへの置き換え
• 不要なvarからletへの修正
• do"=>"repeat
• NSErrorPointerを引数に取るメソッド"=>"throwsするように変更
9月以降に申請予定のアプリなら
Swi%&2でいくっきゃない&!
そうじゃなければ
2ヶ月以上も"swift2"ブランチを
並行運用するのは非常につらい
!"""#
9月頃まとめてやってもいいかもしれないけれど
diffが大きくなってレビューするのが面倒。
ということで事前に差分を吸収する
Xcode&7のGM版を待たずに、互換性を持たせられるところは予め
対応しておくことで後々の差分を減らす。
2.#事前に差分を吸収する
• count(String)"=>"String.characters.count"//"
String.CharacterView"が返る
• =>"count/charactersプロパティを追加する。
// Swift 1.2
extension String {
var count: Int { return Swift.count(self) }
var characters: String { return self }
}
"foo_bar".characters.count // => 7
2.#事前に差分を吸収する
• Array<T>"=>"Array<Element>"//"from"beta"3
• =>"ArrayLiteralConvertible.Element"を使う。
// Swift 1.2
extension Array {
// Swift 2で `SequenceType` に追加されたメソッド。
func flatMap<U>(@noescape transform: (Element) -> U?) -> [U]
}
2.#事前に差分を吸収する
• グローバル関数の削減、Protocol(extensionsへの移行
• =>(Array/Dictionary/Set/LazySequence/Optionalなどのメソッドを使う。
• SequenceType(や(CollectionType(を引数に使っている箇所は諦める(Swi3(1.2ではエミ
ュレートできない)
• 大体ちゃんと変換してくれる(はず)。
// Swift 1.2
let array = [ 1, 2, 3, 4, 5 ]
// bad !
let r = map(filter(array) { $0 % 2 == 0 }) { String($0) } // => [ "2", "4" ]
// good "
let r = array.filter { $0 % 2 == 0 }.map { String($0) } // => [ "2", "4" ]
2.#事前に差分を吸収する
• Printable/DebugPrintable#=>#CustomStringConvertible/
CustomDebugStringConvertible
• =>#typealias#を使う。
// Swift 1.2
typealias CustomStringConvertible = Printable
typealias CustomDebugStringConvertible = DebugPrintable
struct FooBar: CustomStringConvertible {
var description: String { ... }
}
2.#事前に差分を吸収する
• 関数/メソッドの引数ラベルの規則の統一
• Swi&'1.2:'関数は第2引数以降もデフォルトで引数ラベルなしで呼べる。ラベルありにするには'
#'を付ける。外部引数名と内部引数名を分けるとラベルが必要になる。
• Swi&'2:'関数も第2引数以降に引数ラベルが必要になった。メソッドと同じルール。ラベルなし
にするには'_'を付ける。外部引数名と内部引数名を分けるとラベルが必要なのは変わらない。
• =>'外部引数名、内部引数名を分ける。
• =>'ユーティリティクラスなどのstaticメソッドにしてしまう。
• =>'諦めて自動変換に任せる。この場合、関数のシグネチャは変わらずに呼び出し側にラベル
が付加される。
2.#事前に差分を吸収する
• 関数/メソッドの引数ラベルの規則の統一
// before
func globalFooBarFunc(a: String, b: Int) { ... }
globalFooBarFunc("FooBar", 100)
// after 1
func globalFooBarFunc(a: String, b bValue: Int) { ... }
globalFooBarFunc("FooBar", b: 100)
// after 2
final class FooBarUtil() {
private init() {}
static func fooBarMethod(a: String, b: Int) { ... }
}
FooBarUtil.fooBarMethod("FooBar", b: 100)
2.#事前に差分を吸収する
• toString()"=>"Stringのイニシャライザへの置き換え
• Int/UIntはSwi-"1.2でもイニシャライザが存在するのでそれを使う。
• Swi-"2:"String.toInt() -> Int?"もなくなって"Int.init?(_ text: String, radix: Int = default)"
になっている。
// Swift 1.2
let int: Int = 100
let uint: UInt = 12345
// bad !
let intString = toString(int)
let uintString = toString(uint)
// good "
let intString = String(int)
let uintString = String(uint)
2.#事前に差分を吸収する
こんな感じの互換レイヤーは!Swift2.swift!というファイルに
でもまとめておきましょう。
Xcode&7/Swi,&2に上げる時には削除してから&Convert to
Latest Swift Syntax&すればOK。
3.#新機能/新構文を利用する
• Protocol(extensions
• if/while/forでのパターンマッチ
• do/try/catch
• guard
• defer
• Availability:(#available
3.#新機能/新構文を利用する
地道に
// TODO: Swift 2 - guard
if let value = optionalValue {
...
...
...
...
...
} else {
return nil
}
みたいなコメントを残していきましょう!!!
ありがとうございました!

More Related Content

PDF
Xcode and iTC submission topics
PDF
SwiftでAndroidアプリ書けるってよ
PDF
Dynamic frameworks tips
PDF
iOSでのFramework導入のおさらい #関モバ
PPTX
iOSでライブラリを提供する際に気をつけたいこと
PDF
チーム開発にSwiftLintを導入してみた・詳細版
PDF
既存プロジェクトにSwiftLintを導入した話
PDF
Movable Type Data API連携!店舗情報を地図に表示させよう!
Xcode and iTC submission topics
SwiftでAndroidアプリ書けるってよ
Dynamic frameworks tips
iOSでのFramework導入のおさらい #関モバ
iOSでライブラリを提供する際に気をつけたいこと
チーム開発にSwiftLintを導入してみた・詳細版
既存プロジェクトにSwiftLintを導入した話
Movable Type Data API連携!店舗情報を地図に表示させよう!

What's hot (20)

PDF
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
PDF
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
PDF
開発を効率的に進めるられるまでの道程
PDF
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
PDF
デブサミ2014【13-D-2】川田寛氏 HTML5がSIに与えた衝撃、エンジニアは何を学ぶべきか?
PDF
HTML5とか勉強会#48 ionic
PDF
完全負け組なモバイルWebが、これから復活する(多分)
PDF
SIMD.js(ECMAScript 7)
PDF
Swiftビギナーズ勉強会 第1回 @Co-Edo
PDF
マルチデバイスに対応するためのAuto layout
PDF
テストがあればなんとかなる〜効率化までの道程〜
PDF
Angular jsの継続的なバージョンアップ
PDF
Approach of Prototyping for making Application User Interface about iOS
PDF
これからのモバイルWebと最新動向
PDF
Potatotips3 hoshi gaki_akira_iwaya
PDF
クリエイティブの視点から探るAngular 2の可能性
PDF
はじめてのiOSアプリ開発 ①
PDF
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
PPTX
Flex入門
PDF
【ヒカ☆ラボ】初心者向けSwiftアプリのリファクタリング
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
iOSアプリ開発のためのSwiftビギナーズ勉強会 第6回 @Co-Edo
開発を効率的に進めるられるまでの道程
iOS開発を楽しむ最初の一歩!デリゲートをなるべく分かりやすく!
デブサミ2014【13-D-2】川田寛氏 HTML5がSIに与えた衝撃、エンジニアは何を学ぶべきか?
HTML5とか勉強会#48 ionic
完全負け組なモバイルWebが、これから復活する(多分)
SIMD.js(ECMAScript 7)
Swiftビギナーズ勉強会 第1回 @Co-Edo
マルチデバイスに対応するためのAuto layout
テストがあればなんとかなる〜効率化までの道程〜
Angular jsの継続的なバージョンアップ
Approach of Prototyping for making Application User Interface about iOS
これからのモバイルWebと最新動向
Potatotips3 hoshi gaki_akira_iwaya
クリエイティブの視点から探るAngular 2の可能性
はじめてのiOSアプリ開発 ①
できるだけUI系のライブラリを用いないアニメーションを盛り込んだサンプル実装まとめ
Flex入門
【ヒカ☆ラボ】初心者向けSwiftアプリのリファクタリング
Ad

Viewers also liked (14)

PDF
Auto Layout の小技
PDF
var RAC3 = ReactiveCocoa + Swift
PDF
SwiftLint
PDF
CAKeyframeAnimation
PDF
iOS 6 のAuto Rotation
PDF
Audio QueueでSin波再生
PDF
iOSのFileProtection
PDF
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
PDF
How to handle bitcode
PDF
Himotoki: A type-safe JSON decoding library #関モバ
PDF
ObjectMapperでJSONマッピング
PDF
1画面から始めるStoryboard
PDF
Carthageについて知りたいn個のこと
PDF
Protocol-Oriented MVVM (extended edition)
Auto Layout の小技
var RAC3 = ReactiveCocoa + Swift
SwiftLint
CAKeyframeAnimation
iOS 6 のAuto Rotation
Audio QueueでSin波再生
iOSのFileProtection
var RAC3 = ReactiveCocoa + Swift @ ReactiveCocoa Tokyo #rac_tokyo 10/18
How to handle bitcode
Himotoki: A type-safe JSON decoding library #関モバ
ObjectMapperでJSONマッピング
1画面から始めるStoryboard
Carthageについて知りたいn個のこと
Protocol-Oriented MVVM (extended edition)
Ad

Similar to Swift 1.2からSwift 2への移行 #cocoa_kansai (20)

PDF
SwiftとCocoaPodsで始めるサクサクiOS開発!
PDF
Objective-Cプログラマのためのswift導入法
PDF
Wolcome to swift
PDF
Svgアニメーションを実装してみよう 20150207
PDF
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
PDF
第八回 #渋谷Java 最近のjava PaaS事情
PDF
【B-1】kintoneでお手軽コールセンター!
PDF
いまさら触るAwt
PDF
JavaからScalaへの継続的なマイグレーション
PDF
Electron
PDF
High Performance Gulp
PDF
Apple watch対応アプリのポイントや基本実装・連携tips
PDF
Swaggerを利用した新規サービス開発
PDF
Swift Protocol and Selector
PDF
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
KEY
リモートデバッグツール Weinerをつかってみた
PDF
090821 Ruby Sapporo Night Ruby Cocoa
PPTX
iOS13 SDK による 全機能置き換え Part1
PDF
Spring Bootキャンプ @関ジャバ #kanjava_sbc
SwiftとCocoaPodsで始めるサクサクiOS開発!
Objective-Cプログラマのためのswift導入法
Wolcome to swift
Svgアニメーションを実装してみよう 20150207
リーンスタートアップと顧客開発とアジャイル開発を一気通貫するッ #devlove #devkan
第八回 #渋谷Java 最近のjava PaaS事情
【B-1】kintoneでお手軽コールセンター!
いまさら触るAwt
JavaからScalaへの継続的なマイグレーション
Electron
High Performance Gulp
Apple watch対応アプリのポイントや基本実装・連携tips
Swaggerを利用した新規サービス開発
Swift Protocol and Selector
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
リモートデバッグツール Weinerをつかってみた
090821 Ruby Sapporo Night Ruby Cocoa
iOS13 SDK による 全機能置き換え Part1
Spring Bootキャンプ @関ジャバ #kanjava_sbc

Swift 1.2からSwift 2への移行 #cocoa_kansai