SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Objective-C Generics
Goichi Hirakawa
About Me
• 平川 剛一 (Goichi Hirakawa)
• @gooichi
• OS X / iOSソフトウェアエンジニア(フリー)
• GyazSquare / GitHub
• Mailer、デバイス制御、MDM系など
• Objective-C歴XX年
• 初めて触れたのはNextStep…
New Objective-C Features
Objective-CとSwiftをより簡単で効率的に連携させ
るためのXcode 7からの新機能:
• Generics
• Nullability (Updated)
• KindOf Types
• New macros for Swift
New Objective-C Features
Objective-CとSwiftをより簡単で効率的に連携させ
るためのXcode 7からの新機能:
• Generics
• Nullability (Updated)
• KindOf Types
• New macros for Swift
Agenda
• What s Generics?
• Objective-C Generics
• Backward Compatibility
• Generic Classes (iOS 9)
• Variances
• KindOf Types
What s Generics?
• 型に依存しない共通の処理やアルゴリズムを型パラメータ
(Type Parameter)を用いて定義し、汎用化する機能
• ジェネリックプログラミングの仕組み
• 言語により呼び名、機能は若干異なる
• テンプレート(C++)、ジェネリクス(Java、Swiftな
ど)、ジェネリック(MS系言語)、パラメータ化され
た型(Scala)等々
Objective-C Generics
• 他言語と比べ、Lightweight(軽量、簡易)
• APIの表現力を向上させる
• コレクションをより使いやすくする
• Swiftにより型情報がインポート
• より良い静的型チェックを可能にする
• Xcode 7(LLVM 7.0.0)以降
Before Using Generics
Objective-C
@interface UIView
@property (nonatomic, copy ,readonly) NSArray *subviews;
@end
Swift
class UIView {
var subviews: [AnyObject] { get }
}
After Using Generics
Objective-C
@interface UIView
@property (nonatomic,readonly,copy) NSArray<UIView *>*subviews;
@end
Swift
class UIView {
var subviews: [UIView] { get }
}
Static Type Checking
• 型に関する警告が表示される
• ただし、以下は警告は出ない→正しい(後方互換性参照)
Backward Compatibility
• 型消去(Type Erasure)モデルでバイナリ互換
• Objective-Cランタイムに変更なし
• コード生成に影響なし 
• 暗黙の変換によるソース互換性
NSArray<NSString *> *strings = ...;  
NSArray *array = ...;  
array = strings; // OK, 型引数が削除  
strings = array; // OK, 型引数が追加  
Generic Classes (iOS 9)
• NSArray、NSSetとNSDictionary
• これらの型情報はSwiftによりインポートされる
• それ以外のジェネリクス対応クラス
• NSCache、NSEnumerator、NSHashTable、
NSMapTable、NSOrderedSet、PHFetchResult、
および、これらのMutableクラスもジェネリクス対応
• これらの型情報はSwiftによりインポートされない
Variances
• 共変性(covariant)
• A←Bのとき、X<A>変数にX<B>実体を割り当て可能
• 反変性(contravariant)
• A←Bのとき、X<B>変数にX<A>実体を割り当て可能
• 不変性(invariant)
• X<A>変数にはX<A>以外の実体は割り当て不可
Objective-C Generics Variances
• 新しいキーワードの追加
• 共変性:X<__covariant ObjectType>
• NSArray、NSDictionary、NSOrderedSet、NSSet
• 反変性:X<__contravariant ObjectType>
• 現状該当クラスなし
• 不変性:何もつけない(デフォルト)
• 上記クラス以外すべて
Type Safety for Typed Collections
• NSArrayはcovariant(共変)
NSArray<UIView *> *views;
NSArray<UIResponder *> *responders = views; // OK
• NSMutableArrayはinvariant(不変)
UIViewController *viewController;
NSMutableArray<UIView *> *views;
NSMutableArray<UIResponder *> *responders = views; // NG
[responders addObject:viewController];
warning: Incompatible pointer types initializing
'NSMutableArray<UIResponder *> *' with an expression of
type 'NSMutableArray<UIView *> *'
KindOf Types
• 型付きコレクションを使わない場合(従来コード)
@interface UIView (UIViewHierarchy)
@property(nonatomic,readonly,copy) NSArray *subviews;
@end
[view.subviews[0] setTitle:@YES forState:UIControlStateNormal]; // OK
• 型付きコレクションを使う場合→エラー
@interface UIView (UIViewHierarchy)
@property(nonatomic,readonly,copy) NSArray<UIView *> *subviews;
@end
[view.subviews[0] setTitle:@YES forState:UIControlStateNormal]; // NG
error: No visible @interface for 'UIView' declares the selector
'setTitle:forState:'
KindOf Types
• 型付きコレクションは、型安全になり、Swiftからも利用しやす
くなるが、従来のコードでエラーとなるケースが発生
• 新しいキーワードの追加
• __kindof
• __kindof MyClass: MyClassまたはMyClassの派生クラス
@interface UIView (UIViewHierarchy)
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
@end
[view.subviews[0] setTitle:@YES forState:UIControlStateNormal]; // OK
Conclusion
• Objective-Cジェネリクスは、機能的にはLightweightであるが、

以下の理由より既存コードに適用する価値はある:
• 静的型チェック
• Swiftの型情報インポート
• バイナリ互換
• KindOf型はObjective-Cジェネリクスとの組み合わせだけでなく、
既存コードのid型との置き換えでも利用可能
• id型よりも型安全になり、Swiftからも使いやすくなる

Más contenido relacionado

La actualidad más candente

Mix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CMix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CGoichi Hirakawa
 
angular1脳で見るangular2
angular1脳で見るangular2angular1脳で見るangular2
angular1脳で見るangular2Moriyuki Arakawa
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門Shumpei Shiraishi
 
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべてApple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべてMasaru Gushiken
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Kohei Saito
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶShumpei Shiraishi
 
Node.js version16の新機能
Node.js version16の新機能Node.js version16の新機能
Node.js version16の新機能Masaki Suzuki
 
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open APIKohei Saito
 
AngularJSとFluxとRiotJSと
AngularJSとFluxとRiotJSとAngularJSとFluxとRiotJSと
AngularJSとFluxとRiotJSとRyo Iinuma
 
20160702 linuxでもできるc#でアプリ開発
20160702 linuxでもできるc#でアプリ開発20160702 linuxでもできるc#でアプリ開発
20160702 linuxでもできるc#でアプリ開発Takayoshi Tanaka
 
DroidKaigi - Welcome talk
DroidKaigi - Welcome talkDroidKaigi - Welcome talk
DroidKaigi - Welcome talkMasahiro Hidaka
 
Introducing Fluent Design
Introducing Fluent DesignIntroducing Fluent Design
Introducing Fluent Designc-mitsuba
 
あるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクルあるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクルKentaro Iizuka
 

La actualidad más candente (20)

Mix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-CMix and Match / Swift and Objective-C
Mix and Match / Swift and Objective-C
 
Swift入門
Swift入門Swift入門
Swift入門
 
angular1脳で見るangular2
angular1脳で見るangular2angular1脳で見るangular2
angular1脳で見るangular2
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
Editorlt
EditorltEditorlt
Editorlt
 
JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門
 
de:code報告
de:code報告de:code報告
de:code報告
 
iOS豆知識ver0.0.5
iOS豆知識ver0.0.5iOS豆知識ver0.0.5
iOS豆知識ver0.0.5
 
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
Apple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべてApple審査を一発通過!iOS開発経験0でも出来るじげん流Swift開発のすべて
Apple審査を一発通過! iOS開発経験0でも出来る じげん流Swift開発のすべて
 
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
Kifの紹介
Kifの紹介Kifの紹介
Kifの紹介
 
Node.js version16の新機能
Node.js version16の新機能Node.js version16の新機能
Node.js version16の新機能
 
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open APIRESTful API (JAX-RS) 書くだけで仕様書も自動で作られていく話 with MicroProfile Open API
RESTful API (JAX-RS) 書くだけで仕様書も 自動で作られていく話 with MicroProfile Open API
 
Swift勉強会
Swift勉強会Swift勉強会
Swift勉強会
 
AngularJSとFluxとRiotJSと
AngularJSとFluxとRiotJSとAngularJSとFluxとRiotJSと
AngularJSとFluxとRiotJSと
 
20160702 linuxでもできるc#でアプリ開発
20160702 linuxでもできるc#でアプリ開発20160702 linuxでもできるc#でアプリ開発
20160702 linuxでもできるc#でアプリ開発
 
DroidKaigi - Welcome talk
DroidKaigi - Welcome talkDroidKaigi - Welcome talk
DroidKaigi - Welcome talk
 
Introducing Fluent Design
Introducing Fluent DesignIntroducing Fluent Design
Introducing Fluent Design
 
あるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクルあるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクル
 

Destacado

Type Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftType Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftKazunobu Tasaka
 
My first tvOS
My first tvOSMy first tvOS
My first tvOStoyship
 
Caffeでお手軽本格ディープラーニングアプリ @potatotips
Caffeでお手軽本格ディープラーニングアプリ @potatotipsCaffeでお手軽本格ディープラーニングアプリ @potatotips
Caffeでお手軽本格ディープラーニングアプリ @potatotipsTakuya Matsuyama
 
Introducing Cardio
Introducing CardioIntroducing Cardio
Introducing CardioYusuke Kita
 
HealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得するHealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得する今城 善矩
 
tvOSネイティブアプリを作る
tvOSネイティブアプリを作るtvOSネイティブアプリを作る
tvOSネイティブアプリを作るTomoki Hasegawa
 

Destacado (8)

Type Safe Assets Handling in Swift
Type Safe Assets Handling in SwiftType Safe Assets Handling in Swift
Type Safe Assets Handling in Swift
 
My first tvOS
My first tvOSMy first tvOS
My first tvOS
 
Caffeでお手軽本格ディープラーニングアプリ @potatotips
Caffeでお手軽本格ディープラーニングアプリ @potatotipsCaffeでお手軽本格ディープラーニングアプリ @potatotips
Caffeでお手軽本格ディープラーニングアプリ @potatotips
 
Introducing Cardio
Introducing CardioIntroducing Cardio
Introducing Cardio
 
Swift Scriptingのすゝめ
Swift ScriptingのすゝめSwift Scriptingのすゝめ
Swift Scriptingのすゝめ
 
View Monitoring Tips
View Monitoring TipsView Monitoring Tips
View Monitoring Tips
 
HealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得するHealthKitで日別のデータを一度に取得する
HealthKitで日別のデータを一度に取得する
 
tvOSネイティブアプリを作る
tvOSネイティブアプリを作るtvOSネイティブアプリを作る
tvOSネイティブアプリを作る
 

Similar a Objective-C Generics

XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSYoichiro Sakurai
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...Akira Inoue
 
NET 6で実装された新しいLINQ API
NET 6で実装された新しいLINQ APINET 6で実装された新しいLINQ API
NET 6で実装された新しいLINQ APITomomitsuKusaba
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Tomoki Hasegawa
 
Xcode 6の新機能
Xcode 6の新機能Xcode 6の新機能
Xcode 6の新機能Shingo Sato
 
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込むKazumi IWANAGA
 
改めて C# でできることを振り返る
改めて C# でできることを振り返る改めて C# でできることを振り返る
改めて C# でできることを振り返るYuta Matsumura
 
2005 re-reverse engineering goal models from legacy code
2005 re-reverse engineering goal models from legacy code2005 re-reverse engineering goal models from legacy code
2005 re-reverse engineering goal models from legacy coden-yuki
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるのYoshitaka Seo
 
OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理Tadashi Miyazato
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践日本マイクロソフト株式会社
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションmirer
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby CocoaTomoki Maeda
 
Vs code conf2020-11-21-extensions-for-microservices-app-dev
Vs code conf2020-11-21-extensions-for-microservices-app-devVs code conf2020-11-21-extensions-for-microservices-app-dev
Vs code conf2020-11-21-extensions-for-microservices-app-devShotaro Suzuki
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
オレたちとVisual Studioとの関係を話そう
オレたちとVisual Studioとの関係を話そうオレたちとVisual Studioとの関係を話そう
オレたちとVisual Studioとの関係を話そうMitsuhito Ishino
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会codeal
 

Similar a Objective-C Generics (20)

XcodeのTargetについてのTIPS
XcodeのTargetについてのTIPSXcodeのTargetについてのTIPS
XcodeのTargetについてのTIPS
 
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
 
NET 6で実装された新しいLINQ API
NET 6で実装された新しいLINQ APINET 6で実装された新しいLINQ API
NET 6で実装された新しいLINQ API
 
Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法Objective-Cプログラマのためのswift導入法
Objective-Cプログラマのためのswift導入法
 
0831 node学園lt
0831 node学園lt0831 node学園lt
0831 node学園lt
 
Xcode 6の新機能
Xcode 6の新機能Xcode 6の新機能
Xcode 6の新機能
 
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
日々の開発フローにプラスする GitHub Actions ~ セキュリティ対策を取り込む
 
改めて C# でできることを振り返る
改めて C# でできることを振り返る改めて C# でできることを振り返る
改めて C# でできることを振り返る
 
2005 re-reverse engineering goal models from legacy code
2005 re-reverse engineering goal models from legacy code2005 re-reverse engineering goal models from legacy code
2005 re-reverse engineering goal models from legacy code
 
【BS12】Visual Studio 2022 40分一本勝負!
【BS12】Visual Studio 2022 40分一本勝負!【BS12】Visual Studio 2022 40分一本勝負!
【BS12】Visual Studio 2022 40分一本勝負!
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるの
 
OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理OSSを利用したプロジェクト管理
OSSを利用したプロジェクト管理
 
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
【de:code 2020】 Azure Kubernetes Service と Azure DevOps による GitOps の実践
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッション
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa090821 Ruby Sapporo Night Ruby Cocoa
090821 Ruby Sapporo Night Ruby Cocoa
 
Vs code conf2020-11-21-extensions-for-microservices-app-dev
Vs code conf2020-11-21-extensions-for-microservices-app-devVs code conf2020-11-21-extensions-for-microservices-app-dev
Vs code conf2020-11-21-extensions-for-microservices-app-dev
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
オレたちとVisual Studioとの関係を話そう
オレたちとVisual Studioとの関係を話そうオレたちとVisual Studioとの関係を話そう
オレたちとVisual Studioとの関係を話そう
 
第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会第1回 コデアルiOSアプリ勉強会
第1回 コデアルiOSアプリ勉強会
 

Más de Goichi Hirakawa

Strings and characters in swift
Strings and characters in swiftStrings and characters in swift
Strings and characters in swiftGoichi Hirakawa
 
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Goichi Hirakawa
 
Strings and Characters in Swift
Strings and Characters in SwiftStrings and Characters in Swift
Strings and Characters in SwiftGoichi Hirakawa
 

Más de Goichi Hirakawa (6)

Strings and characters in swift
Strings and characters in swiftStrings and characters in swift
Strings and characters in swift
 
WebKit Overview
WebKit OverviewWebKit Overview
WebKit Overview
 
Server-side Swift
Server-side SwiftServer-side Swift
Server-side Swift
 
Swift Type System
Swift Type SystemSwift Type System
Swift Type System
 
Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)Swift API Design Guidelines (dec 3, 2015)
Swift API Design Guidelines (dec 3, 2015)
 
Strings and Characters in Swift
Strings and Characters in SwiftStrings and Characters in Swift
Strings and Characters in Swift
 

Objective-C Generics