SlideShare a Scribd company logo
EZ-‐‑‒NET  熊⾕谷友宏  
http://ez-‐‑‒net.jp/
2015.09.26  
@  カジュアル  Swift  勉強会  #2
Swift  2.0  で変わったところ
Swift  カジュアルプログラミング
(後編)
熊谷友宏
EZ-NET http://ez-net.jp/
@es_kumagai
Xcode 5 徹底解説
IP Phone 音でダイヤル 音で再配達ゴッド
いつもの電卓
with 割勘ウォッチ
MOSA
̶ 勉強会開催 ̶
#yidev 横浜 iPhone 開発者勉強会
カジュアル Swift 勉強会 @ 青葉台
Swift 2.0
̶ 2015.09.16 ̶
大幅な仕様変更
?
そこで
Swift 2.0 で変わったところを
ざっくり紹介してみる
前編
http://www.slideshare.net/
tomohirokumagai54/swift-20-cswift
SlideShare で公開中
前編
後編
NSObject
1/5
performSelector
▶ Selector を使って機能を実行
▶ Objective-C と同等の使い心地
▶ プリミティブ型の引数や戻り値は非対応
performSelector
func performSelector(sel: Selector)

-> Unmanaged<AnyObject>!
func performSelector(sel: Selector,
withObject obj: AnyObject!)
-> Unmanaged<AnyObject>!
func performSelector(sel: Selector,
withObject obj1: AnyObject!,
withObject obj2: AnyObject!)
-> Unmanaged<AnyObject>!
▶ Objective-C と同じ指定方法
▶ 文字列リテラルから生成できる
▶ nil リテラルから生成できる
Selector
struct Selector :
StringLiteralConvertible,
NilLiteralConvertible
文字列を返すメソッドを実行
performSelector
let obj = NSString(string: "TEST.TXT")
// ObjC でいう NSString (NSObject) は取得可能
let extname:String =
obj.performSelector("pathExtension")
.takeRetainedValue()
文字列を渡してメソッドを実行
performSelector
let obj = NSString(string: "TEST.TXT")
// ObjC でいう NSString (NSObject) は取得可能
let extname:String =
obj.performSelector(
"componentsSeparatedByString:",
withObject: "T")
.takeRetainedValue()
プリミティブな値は取得できない?
performSelector
let obj = NSString(string: "TEST.TXT")
// 戻り値が NSInteger (long) 相当だと nil になる
let length:Int =
obj.performSelector("length")
.takeRetainedValue()
Execution was interrupted, reason: EXC_BAD_ACCESS.
プリミティブな引数は受け取れない?
performSelector
let obj = NSString(string: "TEST.TXT")
// NSUInteger (unsigned long) 相当を渡せない
let length:Int =
obj.performSelector("characterAtIndex:",
withObject: UInt(1))
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
characterAtIndex: Range or index out of bounds.
プリミティブな引数は受け取れない?
performSelector
let obj = NSString(string: "TEST.TXT")
// NSNumber に変換しても渡せない
let length:Int =
obj.performSelector("characterAtIndex:",
withObject: NSNumber(unsignedInteger:1))
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
characterAtIndex: Range or index out of bounds.
Swift performSelector
引数
Swift クラスの機能は呼び出せる?
performSelector
class MyClass : NSObject {
func toStringWithStr(v:String) -> String
func toStringWithInt(v:Int) -> String
}
文字列を受け取るメソッドは実行可能
performSelector
let obj = MyClass()
// String を渡すメソッドは正常動作
let result:String =
obj.performSelector("toStringWithStr:",
withObject: "A")
.takeRetainedValue()
数値を受け取るメソッドは予期しない動作
performSelector
let obj = MyClass()
// Int だと渡した値とは違う値が渡される様子
let result:String =
obj.performSelector("toStringWithInt:",
withObject: 1)
.takeRetainedValue()
エラーにならないが 違う値 が渡される
数値を受け取るメソッドは予期しない動作
performSelector
let obj = MyClass()
// NSNumber にラップしても違う値が渡される様子
let result:String =
obj.performSelector("toStringWithInt:",
withObject: NSNumber(integer:1))
.takeRetainedValue()
エラーにならないが 違う値 が渡される
NSNumber を受け取るメソッドは OK
performSelector
let obj = MyClass()
// 呼び出し先が NSNumber を受け取るなら正常動作
let result:String =
obj.performSelector("toStringWithNSNumber:",
withObject: NSNumber(integer:1))
.takeRetainedValue()
NSNumber を受け取るメソッドは OK
performSelector
let obj = MyClass()
// 呼び出し先の NSNumber にリテラル値も渡せる
let result:String =
obj.performSelector("toStringWithNSNumber:",
withObject: 1)
.takeRetainedValue()
Swift performSelector
戻り値
Swift クラスの機能は呼び出せる?
performSelector
class MyClass : NSObject {
func asString() -> String
func asInt() -> Int
}
文字列を返すメソッドは実行可能
performSelector
let obj = MyClass()
// String 型の戻り値は取得可能
let value:String =
obj.performSelector("asString")
.takeRetainedValue()
整数を返すメソッドは実行できない
performSelector
let obj = MyClass()
// Int 型の戻り値は取得できない
let value:Int =
obj.performSelector("asInteger")
.takeRetainedValue()
Execution was interrupted, reason: EXC_BAD_ACCESS.
Swift performSelector
ObjC 互換 & Swift ネイティブ
Swift で定義したクラスは受け取れる?
performSelector
class MyClass : NSObject {
func asObjC() -> ObjCClass
func asNative() -> NativeClass
}
class ObjCClass : NSObject {
}
class NativeClass {
}
ObjC 互換クラスを返すメソッドは実行可能
performSelector
let obj = MyClass()
// 自作 ObjC 互換クラスは取得できるが AnyObject
let result:AnyObject =
obj.performSelector("asObjC")
.takeRetainedValue()
// キャストして正常に使用できる
let value:Int
= (result as! ObjCClass).value
Swift クラスを返すメソッドは実行できない
performSelector
let obj = MyClass()
// Swift ネイティブ型の戻り値は取得できない
let value:Int =
obj.performSelector("asNative")
.takeRetainedValue()
Execution was interrupted, reason: signal SIGABRT.
asNative: unrecognized selector sent to instance.
performSelector は
独特の癖に悩まされそう
performSelector
スレッド
performSelector
extension NSObject {
func performSelectorOnMainThread(
aSelector: Selector,
withObject arg: AnyObject?,
waitUntilDone wait: Bool)
func performSelector(
aSelector: Selector,
onThread thr: NSThread,
withObject arg: AnyObject?,
waitUntilDone wait: Bool)
func performSelectorInBackground(
aSelector: Selector,
withObject arg: AnyObject?)
}
@objc
▶ ObjC で使いたい Swift クラスに付与
▶ NSObject を継承していなくても良い
@objc
これまで
▶ ObjC 互換な Swift クラスに付与
▶ NSObject を継承している必要がある
これから
// NSObject を継承しないクラスには付けられない
@objc class SwiftClass {
}
// NSObject を継承するクラスには付けてもいい
@objc class SwiftClass : NSObject {
}
Only classes that inherit from NSObject
can be declared @objc
コンパイル時の扱われ方
@objc class
// 原則 ObjC 互換クラスにだけ設定できる
@objc protocol MyProtocol {
}
// 全ての型に設定できる
protocol MyProtocol {
}
コンパイル時の扱われ方
@objc protocol
実装を要求しない場合は

どんな型にも設定できる
// 明記によりネイティブクラスにも設定可能
@objc protocol MyProtocol {
func method()
}
// @objc プロトコルが要求する機能に @objc を明記
class SwiftClass : MyProtocol {
@objc func method()
}
コンパイル時の扱われ方
@objc protocol
@nonobjc
▶ Objective-C にブリッジしない機能を明示
▶ プロパティやメソッドに記載する
@nonobjc
class SwiftClass : NSObject {
var value:Int
@nonobjc var native:Int
@objc var compatible:Int
}
ブリッジしない機能を選べる
@nonobjc
SwiftClass* instance
= [[SwiftClass alloc] init];
// @nonobjc を付与した機能は候補に挙がらない
instance.value
制御構文
2/5
#available
▶ プラットフォーム毎に条件を指定
▶ 必ず『全てのプラットフォーム』を含む
▶ 判定は実行時に行われる
#available
// 全てのプラットフォームが対象
#available(*)
// OSX 10.10 以上と、その他のプラットフォームが対象
#available(OSX 10.10, *)
// OSX 10.10 以上と、iOS 8.4 以上と、

// その他のプラットフォームが対象
#available(OSX 10.10, iOS 8.4, *)
if 文で使用する
#available
if #available(OSX 10.10, *) {
// OSX 10.10 以上か、その他のプラットフォーム
}
else {
// OSX 10.10 未満
}
else if 文も使用できる
#available
if #available(OSX 10.9, *) {
// OSX 10.9 以上か、その他のプラットフォーム
}
else if #available(OSX 10.10, *) {
// OSX 10.9 以上か、その他のプラットフォーム
}
else {
// OSX 10.9 未満
}
論理演算はできない
#available
if #available(iOS 9.0, *) && value == 1 {
} Expected { after if condition
条件を必ず満たす場合は警告扱い
#available
// Deployment Target が iOS 9.0 のとき
if #available(iOS 9.0, *) {
}
Unnecessary check for iOS ; minimum deployment
target ensures guard will always be true
▶ ライブラリ内で使用されていると

使うときに警告に悩まされるかもしれない
guard 文で使用する
#available
guard #available(OSX 10.10, *) else {
// 条件を満たさない場合は早期 Exit 必須
}
// 以降は OSX 10.10 以上か、
// その他のプラットフォームであることを保証
指定できるプラットフォーム
#available
▶ *
▶ iOS
▶ iOSApplicationExtension
▶ OSX
▶ OSXApplicationExtension
▶ watchOS
▶ watchOSApplicationExtension
Error Handling
3/5
Beta  5  以降降の  
変更更点
Error Type
列挙型以外もエラー型にできる
Error Type
// 構造体でもエラーを定義可能
struct FileOperationError : ErrorType {
}
▶ 型を ErrorType に準拠
▶ 既定のエラードメインは型名
▶ 既定のエラーコードは 1
ドメインとエラーコードを指定可能?
Error Type
// 構造体でもエラーを定義可能
struct FileOperationError : ErrorType {
var _code:Int
var _domain:String
}
▶ _code でエラーコードを指定
▶ _domain でエラードメインを指定可能
▶ インスタンス毎に違う値を持てる
▶ ただしプロトコルには明記されていない
エラーの送出方法
Error Type
// インスタンスを生成してエラー送信
throw FileOperationError()
rethrows
標準メソッドが rethrows に対応
rethrows
func map<T>(
transform: (Generator.Element) throws -> T
)
rethrows -> [T]
func reduce<T>(
initial: T,
combine: (T, Generator.Element) throws -> T
) rethrows -> T
func filter(
element: (Generator.Element) throws -> Bool
)
rethrows -> [Generator.Element]
演算子も かに rethrows 対応
rethrows
func &&<T : BooleanType, U : BooleanType>(
lhs: T,
@autoclosure rhs: () throws -> U
)
rethrows -> Bool
func ||<T : BooleanType, U : BooleanType>(
lhs: T,
@autoclosure rhs: () throws -> U
)
rethrows -> Bool
func ??<T>(
optional: T?,
@autoclosure defaultValue: () throws -> T
)
rethrows -> T
try?
エラー機構をオプショナルに変換
try?
var handle:Handle? = try? File.open(path)
▶ 戻り値をオプショナルで包む
▶ エラーが発生すると nil が返る
▶ エラー情報は 破棄 される
動作のイメージ
try?
// 戻り値をオプショナルで扱う
var handle:Handle?
do {
// メソッドを呼び出して戻り値を取得
handle = try File.open(path)
} catch {
// エラーが発生した場合は nil を設定
handle = nil
}
guard で使う
try?
guard let handle = try? File.open(path) else {
// エラーが発生したときに早期 Exit
return
}
// これ以降はファイルを開けた前提で記載できる
return readFrom(handle)
rethrows と使う
try?
// クロージャー内でエラー発生時に全体を nil に変換
let sum:Int? = try? objects.reduce(0) {
try $0 + $1.toInt()
}
// メソッドチェーンの流れを打ち切ってみたり
let sum:Int? = try? objects
.map { try $0.toInt() }
.reduce(0, combine: +)
関数
4/5
大域関数
// 主要な大域関数が軒並み削除
count(array)
map(array) { $0 }
// プロトコル拡張に移行された
extension CollectionType {
var count: Index.Distance { get }
func map<T>(f:(Generator.Element)->T)->[T]
}
大域関数の多くがプロトコル拡張に移行
大域関数
// Swift 1 までの呼び出し方
count(array)
map(array) { $0 }
// Swift 2 からの呼び出し方
array.count
array.map { $0 }
機能の呼び出し方の違い
大域関数
// toString 関数が削除された
let string = toString(value)
// これからは String の変換イニシャライザを使う
let string = String(value)
toString 関数は変換イニシャライザへ
大域関数
▶ 変換は型が責任を持つ意志の顕われ?
引数のラベル付けルール
▶ Swift 1.x では 3 つのルール
✴ 関数
✴ メソッド
✴ イニシャライザ
▶ Swift 2.0 では 2 つのルール
✴ 関数 & メソッド
✴ イニシャライザ
引数のラベル付けルール
関数はメソッドと同じルールに変更
引数のラベル付けルール
// このような 関数 定義のとき
func getPrice(price:Int, tax:Double) -> Int
// Swift 1 では両方にラベル名が不要
getPrice(100, 0.05)
// Swift 2 では第二引数以降でラベル名が必要
getPrice(100, tax: 0.05)
▶ 外部引数名の明記が必須
▶ 同じ名前でも # で表記できない
func getPrice(#price:Int) -> Int
func getPrice(price price:Int) -> Int
外部ラベル名の省略表記が廃止
引数のラベル付けルール
'#' has been removed from Swift; double up 'price price' to
make the argument label the same as the parameter name
まとめ
引数のラベル付けルール
▶ 左側に _ を付けてラベル名を削除可能
▶ 左側にラベル名を明記できる
引数ラベル 第1引数 第2引数 …
関数
メソッド
なし(明示で付与) あり(_ で削除)
イニシャライザ あり(_ で削除)_ あり(_ で削除)
ディフォルト引数の補完
▶ 全ての引数を省略した時の補完候補
▶ 全ての引数を指定するための補完候補
func action(a:Int, b:Int = 1, c:Int = 2) {
}
// 複数の補完候補が表示される
value.action
補完候補が複数出るようになった
ディフォルト引数の補完
forEach
forEach
extension SequenceType {
func forEach(
@noescape body:(Generator.Element) throws -> ()
)
rethrows
}
▶ 各要素を順番に処理
▶ 処理にはクロージャーを使う
▶ for … in と似た動作(関数+クロージャー版)
メソッドチェインと併用する
forEach
items.filter(isValid).forEach {
$0.activate()
}
▶ break や continue は使えない
▶ return はクロージャーを抜ける
▶ チェーン以外では for … in を推奨らしい
クロージャーで  
処理理を実⾏行行
可変長引数
定義と実行方法
可変長引数
// 可変値引数を引数リストの途中に含む関数の定義
func writeTo( path:String,
items:String...,
permit:Int ) {
}
// 定義した関数の実行
writeTo(path, items:"A","B","C", permit:0o775)
可変⻑⾧長引数の終わりは

ラベルで判断
既定値引数と併せて使う
可変長引数
// 可変値引数の後に既定値を持つ引数を定義
func writeTo( path:String,
items:String...,
permit:Int = 0o755) {
}
// 定義した関数の実行
writeTo(path, items:"A","B","C")
可変⻑⾧長引数の後の  
引数を省省略略可能
末尾クロージャーと併せて使う
可変長引数
// 引数リストの最後でクロージャーを定義
func writeTo( path:String,
items:String...,
preAction:(String) -> String) {
}
// 定義した関数の実行
writeTo(path, items:"A","B","C") {
return parseItem($0)
} 末尾クロージャーの  
書式で引数を渡せる
複数の可変長引数は指定できない
可変長引数
// 複数の可変長引数があるとビルドエラー
func writeTo( path:String,
items:String...,
permits:Int...) {
} Only a single variadic parameter '...' is permitted
イニシャライザ
失敗可能イニシャライザに委譲可能
イニシャライザ
struct MyType {
// 失敗可能イニシャライザがあったとき
init?(string: String) {
}
// ある失敗可能イニシャライザで
init?(resource:String) {
// 別の失敗可能イニシャライザへ委譲可能
self.init(string: readFrom(resource))
}
}
失敗時は  nil
通常のものから失敗可能なものに委譲
イニシャライザ
struct MyType {
// 失敗可能イニシャライザがあったとき
init?(string: String) {
}
// ある通常のイニシャライザで
init() {
// 別の失敗可能イニシャライザへ委譲可能
self.init(string: "DEFAULT")!
}
}
失敗時は打ち切切り
let strings = ["10", "3.5", "8", "20.8"]
// イニシャライザを普通の関数として渡せる
let values = strings.flatMap(Double.init)
▶ イニシャライザの引数を取る
▶ 戻り値に自身の型を返す
▶ 失敗可能な場合はオプショナルを返す
静的メソッドとして使える
イニシャライザ
struct Selector : StringLiteralConvertible {
init(_ str: String)
init(stringLiteral value: String)
}
// 実行したい方を選択できない
let sel = optionalString.map(Selector.init)
▶ 引数ラベル名で選択できない
▶ 関数型の引数に適切なものを渡しづらい
静的メソッドは衝突しやすい
イニシャライザ
Ambiguous reference to
member Selector.init
インスタンスメソッド
Swift 2 以前からかもしれない
let string = "New in Swift 2.0"
// インスタンスからメソッドを呼び出す操作を
string.containsString("Swift")
// 型から静的メソッドを呼ぶ操作に書き換えられる
String.containsString(string)("Swift")
▶ インスタンスを取り

本来のインスタンスメソッドを返す関数
▶ プロパティーは静的メソッドにならない
静的メソッドとして使える
インスタンスメソッド
// クロージャーを使ったメソッドチェイン
let sorted = letters
.filter { string.containsString($0) }
.sort { $0 > $1 }
// 関数だけで作ったメソッドチェイン
let sorted = letters
.filter(String.containsString(string))
.sort(>)
静的メソッドとメソッドチェインの例
インスタンスメソッド
列挙型
5/5
indirect case
// 再帰的な列挙型を定義
enum Cascade {
indirect case Device(String, next:Cascade)
case Terminate
}
再帰的な列挙型を作る
indirect case
// 再帰的に列挙子を組み立てられる
let devices:Cascade =
.Device("HDD",
next: .Device("DVD",
next: .Device("MO",
next: .Terminate)))
indirect  case  にすることで

列列挙⼦子の値で⾃自⾝身の型を扱える
深さを計算する機能の実装例
indirect case
extension Cascade {
var depth:Int {
switch self {
case .Device(_, next: let next):
return 1 + next.depth
case .Terminate:
return 0
}
}
}
// 深さを計算する
devices.depth
Raw 値
// 再帰的な列挙型を定義
enum Language : String {
case Swift
case ObjectiveC = "Objective-C"
case C
case Ruby
}
// 未設定のものは列挙子名と同じ文字列が得られる
Language.Swift.rawValue
列挙子と同じ文字列なら省略可能に
Raw 値
列列挙⼦子と違う場合だけ

明記すれば  OK
おしまい
他にも細かい変更はあるけれど 😏
Swift 2.0 で変わったところ
▶ NSObject
▶ 制御構文
▶ Error Handling
▶ 関数
▶ 列挙型
前編後編
▶ 制御構文
▶ Error Handling
▶ 詳細な条件指定
▶ Extension

More Related Content

PDF
リテラルと型の話 #__swift__
PDF
Swift 2.0 で変わったところ「前編」 #cswift
PDF
Swift 2.0 の Error Handling #yhios
PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
PDF
可変値変数 var を極力避けることを模索するための事前知識 #cswift
PDF
プロトコル指向に想う世界観 #__swift__
PDF
Swift 2.0 大域関数の行方から #swift2symposium
PDF
Study Swift
リテラルと型の話 #__swift__
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2.0 の Error Handling #yhios
ジェネリック関数の呼び出され方 #cocoa_kansai
可変値変数 var を極力避けることを模索するための事前知識 #cswift
プロトコル指向に想う世界観 #__swift__
Swift 2.0 大域関数の行方から #swift2symposium
Study Swift

What's hot (20)

PDF
lazy var の特徴を知る #cocoa_kansai #cswift
PDF
Swift の可変値と不変値 #cocoa_kansai
PDF
Swift 2 (& lldb) シンポジウム
PPTX
Swift 2.0 変更点(だいたい)まとめ
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
Griffon10 in groovy_fx
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PPTX
GoF デザインパターン 2009
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
Inside FastEnum
PPTX
final int をFINAL しやがれ!
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
PPTX
Deep dive into oss written in swift
PDF
テストを書こう、Unity編
PDF
知って得するC#
PDF
Ext.directことはじめ
PDF
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
PDF
Kanazawa.js.Next
PDF
今日からできる!簡単 .NET 高速化 Tips
PDF
第三回ありえる社内勉強会 「いわががのLombok」
lazy var の特徴を知る #cocoa_kansai #cswift
Swift の可変値と不変値 #cocoa_kansai
Swift 2 (& lldb) シンポジウム
Swift 2.0 変更点(だいたい)まとめ
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Griffon10 in groovy_fx
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
GoF デザインパターン 2009
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Inside FastEnum
final int をFINAL しやがれ!
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Deep dive into oss written in swift
テストを書こう、Unity編
知って得するC#
Ext.directことはじめ
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Compon...
Kanazawa.js.Next
今日からできる!簡単 .NET 高速化 Tips
第三回ありえる社内勉強会 「いわががのLombok」
Ad

Similar to Swift 2.0 で変わったところ「後編」 #cswift (20)

PDF
Swift らしい表現を目指そう #eventdots
PDF
Swift2.x を Scala からみる
PDF
Swift入門おさらい
PDF
Swiftのアプリ開発でハマったこと
PDF
Swift を振り返ってみよう #cswift
PDF
続・ゲンバのSwift
PDF
Swift事情2014夏 ~ Swift入門 beta6対応
PDF
プロトコル指向 - 夢と現実の狭間 #cswift
PDF
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
PDF
Wolcome to swift
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
PPTX
SwiftのOptionalを理解する
PDF
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
PDF
Swift勉強会
PDF
SwiftのOptionalを理解する
PDF
ゲンバのSwift
PDF
Swift api design guidelines (dec 3, 2015)
PDF
Swift API Design Guidelines (dec 3, 2015)
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
Swift らしい表現を目指そう #eventdots
Swift2.x を Scala からみる
Swift入門おさらい
Swiftのアプリ開発でハマったこと
Swift を振り返ってみよう #cswift
続・ゲンバのSwift
Swift事情2014夏 ~ Swift入門 beta6対応
プロトコル指向 - 夢と現実の狭間 #cswift
Swift 3.0 の新機能 - 追加・変更まわりだけ、ざっくり紹介 2 #devsap
Wolcome to swift
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
SwiftのOptionalを理解する
Swift - Result&lt;t>型で結果を返すのは邪道か,王道か
Swift勉強会
SwiftのOptionalを理解する
ゲンバのSwift
Swift api design guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
Ad

More from Tomohiro Kumagai (20)

PDF
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
PDF
Swift 所有権 要諦 #ゆるちとせ
PDF
_Function Builders in Swift #love_swift
PDF
Property Wrappers の特徴を眺める #swiftzoomin
PDF
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
PDF
みんなで Swift 復習会
GO! in 札幌 – 10th′′
PDF
イニシャライザー Part 2.5 #hakataswift
PDF
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
PDF
Swift クラスのイニシャライザー #devsap
PDF
iOSCon 2019 in London #ioscon #love_swift
PDF
Around the 変数 let #love_swift
PDF
もくもく執筆会 #技術同人誌再販Night
PDF
みんなで Swift 復習会 GO! in 岩手 – 9th′
PDF
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
PDF
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
PDF
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
PDF
みんなで Swift 復習会
GO! in 京都 – 6th′
PDF
みんなで Swift 復習会 GO! in 福岡 – 5th′
PDF
勉強会の東京外開催の気持ち #yuru_bounen2017
PDF
みんなで Swift 復習会 GO! in 福岡・発表資料
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
Swift 所有権 要諦 #ゆるちとせ
_Function Builders in Swift #love_swift
Property Wrappers の特徴を眺める #swiftzoomin
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会
GO! in 札幌 – 10th′′
イニシャライザー Part 2.5 #hakataswift
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
Swift クラスのイニシャライザー #devsap
iOSCon 2019 in London #ioscon #love_swift
Around the 変数 let #love_swift
もくもく執筆会 #技術同人誌再販Night
みんなで Swift 復習会 GO! in 岩手 – 9th′
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会 GO! in 福岡 – 5th′
勉強会の東京外開催の気持ち #yuru_bounen2017
みんなで Swift 復習会 GO! in 福岡・発表資料

Swift 2.0 で変わったところ「後編」 #cswift