SlideShare a Scribd company logo
1 of 102
Download to read offline
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

What's hot

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

What's hot (20)

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

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

Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
Unit test in android
Unit test in androidUnit test in android
Unit test in androidTatsuya Maki
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„和弘 井之上
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門bleis tift
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動Shinichi Kozake
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
これからはじめる SwiftPlayground入門
これからはじめる SwiftPlayground入門これからはじめる SwiftPlayground入門
これからはじめる SwiftPlayground入門Hiramatsu Ryosuke
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Leap Motion - 1st Review
Leap Motion - 1st ReviewLeap Motion - 1st Review
Leap Motion - 1st ReviewTsukasa Sugiura
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
Linq To Fun
Linq To FunLinq To Fun
Linq To Fundeflis
 

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

Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
Unit test in android
Unit test in androidUnit test in android
Unit test in android
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
F#によるFunctional Programming入門
F#によるFunctional Programming入門F#によるFunctional Programming入門
F#によるFunctional Programming入門
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Node.js入門
Node.js入門Node.js入門
Node.js入門
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
これからはじめる SwiftPlayground入門
これからはじめる SwiftPlayground入門これからはじめる SwiftPlayground入門
これからはじめる SwiftPlayground入門
 
Task
TaskTask
Task
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Leap Motion - 1st Review
Leap Motion - 1st ReviewLeap Motion - 1st Review
Leap Motion - 1st Review
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
Linq To Fun
Linq To FunLinq To Fun
Linq To Fun
 

More from Tomohiro Kumagai

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

More from Tomohiro Kumagai (20)

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

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