SlideShare a Scribd company logo
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からも使いやすくなる

More Related Content

PDF
watchOS2 tips
PDF
New Objective-C Features for Swift 2.0
PDF
Xcode7時代のアプリ配布
PDF
Objective-C Generics LT version
PDF
個人で開発したアプリがベスト新着に選ばれた話
PDF
.NET Core 3.0 で見る Client Apps #BuriKaigi #BuriKaigi2019
PDF
20150421 Geeks Night @ Money Foward
PDF
How to improve Type-safety in your Objective-C code
watchOS2 tips
New Objective-C Features for Swift 2.0
Xcode7時代のアプリ配布
Objective-C Generics LT version
個人で開発したアプリがベスト新着に選ばれた話
.NET Core 3.0 で見る Client Apps #BuriKaigi #BuriKaigi2019
20150421 Geeks Night @ Money Foward
How to improve Type-safety in your Objective-C code

What's hot (20)

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

Viewers also liked (8)

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

Similar to Objective-C Generics (9)

PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
PDF
実践業務を爆速でこなすtipsとgenerics
PDF
Can we live in a pure Swift world?
PDF
Swift 2.0 大域関数の行方から #swift2symposium
PDF
Swift を振り返ってみよう #cswift
PDF
PDF
Objective-C/Swift コードの共用
PDF
iOS 8/Swift 概要 #ios8yahoo
PDF
What's new Swift3
ジェネリック関数の呼び出され方 #cocoa_kansai
実践業務を爆速でこなすtipsとgenerics
Can we live in a pure Swift world?
Swift 2.0 大域関数の行方から #swift2symposium
Swift を振り返ってみよう #cswift
Objective-C/Swift コードの共用
iOS 8/Swift 概要 #ios8yahoo
What's new Swift3

More from Goichi Hirakawa (6)

PDF
Strings and characters in swift
PDF
WebKit Overview
PDF
Server-side Swift
PDF
Swift Type System
PDF
Swift API Design Guidelines (dec 3, 2015)
PDF
Strings and Characters in Swift
Strings and characters in swift
WebKit Overview
Server-side Swift
Swift Type System
Swift API Design Guidelines (dec 3, 2015)
Strings and Characters in Swift

Objective-C Generics