Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Mix and Match
Swift and Objective-C
Goichi Hirakawa
自己紹介
• 平川 剛一 (Goichi Hirakawa)
• @gooichi
• OS X / iOSソフトウェアエンジニア(フリー)
• GyazSquare / GitHub
• Mailer、デバイス制御などお固いアプリをメイン
•...
SwiftとObjCの組み合わせ
• 同一プロジェクトで共存可
• 考慮すべきこと:
• 相互クラス参照
• ObjCからSwiftの利用
• Swift名オーバーライド
• Swiftで利用不可
• ObjC宣言の洗練
• モジュールの命名
クラス参照(アプリ)
• Objective-CをSwiftへインポート
• Xcodeが XXX-Bridging-Header.h を自動的に作成
• Swiftから参照するクラスのヘッダを記述
#import "XYZCustomCell...
クラス参照(フレームワーク)
• Objective-CをSwiftへインポート
• Build Settingsの Defines Module 設定を YES
• UmbrellaヘッダにSwiftに公開するObjCヘッダを記述
#impor...
ObjCからSwiftの利用
• SwiftコードをインポートするとObjC構文で利用可能
• @objc属性が必要
• ObjCクラス継承の場合、自動的に付加
• ObjC非互換の機能は利用不可
• ジェネリクス、タプル、Int Raw値でな...
Swift名オーバーライド
• ObjCのメソッド名、列挙型のケース、オプション設定値を変更可能
• NS_SWIFT_NAME(_name)マクロ
+ (instancetype)recordWithRPM:(NSUInteger)RPM
N...
Swiftで利用不可
• Swiftでは適切でない/不要なObjCの宣言をインポー
トさせない
• NS_SWIFT_UNAVAILABLE(_msg)マクロ
+ (instancetype)collectionWithValues:(NSAr...
ObjC宣言の洗練
• 元の実装を有効にしたまま、洗練されたSwiftのインターフェイスを拡張で提供
• NS_REFINED_FOR_SWIFTマクロ
• ObjCのインターフェイス
@interface Color : NSObject
-...
モジュールの命名
• 製品モジュール名からXcodeはヘッダ接頭辞を命名
• XXX-Bridging-Header.h 、 XXX-Swift.h
• デフォルトで製品モジュール名は製品名と同じ
• アルファベット、数字以外はアンダースコア(...
まとめ
• SwiftとObjective-Cの組み合わせについて
• 詳細については、Using Swift with Cocoa and Objective-C (Swift 2.1)の
Mix and Matchを参照
• 追記:NS_S...
Upcoming SlideShare
Loading in …5
×

Mix and Match / Swift and Objective-C

2,549 views

Published on

もくもくiOS勉強会@ネクスト 1周年記念LT会
http://mokumoku-ios-at-next.connpass.com/event/19921/
Swift 2とObjective-Cの組み合わせについて

Published in: Software
  • Be the first to comment

Mix and Match / Swift and Objective-C

  1. 1. Mix and Match Swift and Objective-C Goichi Hirakawa
  2. 2. 自己紹介 • 平川 剛一 (Goichi Hirakawa) • @gooichi • OS X / iOSソフトウェアエンジニア(フリー) • GyazSquare / GitHub • Mailer、デバイス制御などお固いアプリをメイン • Objective-C歴1X年 • NextStep時代から…
  3. 3. SwiftとObjCの組み合わせ • 同一プロジェクトで共存可 • 考慮すべきこと: • 相互クラス参照 • ObjCからSwiftの利用 • Swift名オーバーライド • Swiftで利用不可 • ObjC宣言の洗練 • モジュールの命名
  4. 4. クラス参照(アプリ) • Objective-CをSwiftへインポート • Xcodeが XXX-Bridging-Header.h を自動的に作成 • Swiftから参照するクラスのヘッダを記述 #import "XYZCustomCell.h" • SwiftをObjective-Cへインポート • Xcodeが XXX-Swift.h を自動的に作成 • Swiftを利用するObjCソースでimport #import "ProductModuleName-Swift.h"
  5. 5. クラス参照(フレームワーク) • Objective-CをSwiftへインポート • Build Settingsの Defines Module 設定を YES • UmbrellaヘッダにSwiftに公開するObjCヘッダを記述 #import <XYZ/XYZCustomCell.h> • SwiftをObjective-Cへインポート • Build Settingsの Defines Module 設定を YES • Swiftクラスを利用するObjCソースでimport #import <ProductName/ProductName-Swift.h>
  6. 6. ObjCからSwiftの利用 • SwiftコードをインポートするとObjC構文で利用可能 • @objc属性が必要 • ObjCクラス継承の場合、自動的に付加 • ObjC非互換の機能は利用不可 • ジェネリクス、タプル、Int Raw値でない列挙型、Swiftで定義さ れた構造体/トップレベル関数/グローバル変数/型エイリアス、 Swiftスタイルの可変長引数、ネスト型、カリー関数 • ObjCでのSwiftクラスのサブクラス化は不可
  7. 7. Swift名オーバーライド • ObjCのメソッド名、列挙型のケース、オプション設定値を変更可能 • NS_SWIFT_NAME(_name)マクロ + (instancetype)recordWithRPM:(NSUInteger)RPM NS_SWIFT_NAME(init(RPM:)); + (id)recordWithQuality:(double)quality NS_SWIFT_NAME(record(quality:)); typedef NS_ENUM(NSInteger, ABCRecordSide) { ABCRecordSideA, ABCRecordSideB NS_SWIFT_NAME("FlipSide"), };
  8. 8. Swiftで利用不可 • Swiftでは適切でない/不要なObjCの宣言をインポー トさせない • NS_SWIFT_UNAVAILABLE(_msg)マクロ + (instancetype)collectionWithValues:(NSArray *)values forKeys:(NSArray<NSCopying> *)keys NS_SWIFT_UNAVAILABLE("Use a dictionary literal instead");
  9. 9. ObjC宣言の洗練 • 元の実装を有効にしたまま、洗練されたSwiftのインターフェイスを拡張で提供 • NS_REFINED_FOR_SWIFTマクロ • ObjCのインターフェイス @interface Color : NSObject - (void)getRed:(nullable CGFloat *)red green:(nullable CGFloat *)green blue:(nullable CGFloat *)blue alpha:(nullable CGFloat *)alpha NS_REFINED_FOR_SWIFT; @end • Swiftの拡張インターフェイス extension Color { var RGBA: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { var r: CGFloat = 0.0 var g: CGFloat = 0.0 var b: CGFloat = 0.0 var a: CGFloat = 0.0 __getRed(&r, green: &g, blue: &b, alpha: &a) return (red: r, green: g, blue: b, alpha: a) } }
  10. 10. モジュールの命名 • 製品モジュール名からXcodeはヘッダ接頭辞を命名 • XXX-Bridging-Header.h 、 XXX-Swift.h • デフォルトで製品モジュール名は製品名と同じ • アルファベット、数字以外はアンダースコア(_)
  11. 11. まとめ • SwiftとObjective-Cの組み合わせについて • 詳細については、Using Swift with Cocoa and Objective-C (Swift 2.1)の Mix and Matchを参照 • 追記:NS_SWIFT_NOTHROWマクロ • スローさせずにNSErrorを生成するための宣言 • 詳細はAdopting Cocoa Design Patternsを参照 - (BOOL)checkResourceIsReachableAndReturnError: (NSError **)error NS_SWIFT_NOTHROW NS_AVAILABLE(10_6, 4_0);

×