Using Swift with Cocoa and Objective-Cのメモ(その2)
はじめに
これは、『Using Swift with Cocoa and Objective-C』を読んだ時の個人的なメモです。なので、引用はすべて『Using Swift with Cocoa and Objective-C』から。
iTunes - ブック - Apple Inc.「Using Swift with Cocoa and Objective-C」
https://itunes.apple.com/jp/book/using-swift-cocoa-objective/id888894773?mt=11
その1はこちら。
Using Swift with Cocoa and Objective-Cのメモ(その1) - 開発メモ
http://seeku.hateblo.jp/entry/2014/06/20/205708
Adopting Cocoa Design Patterns
- よく設計された弾力性のあるアプリを作るには、Cocoaで確立されたデザインパターンを使用するのが良いよ
- これらのパターンの多くはObjective-Cと関連づいてるけど、SwiftはObjective-Cと相互運用性があるから同じパターンが使えるよ
Delegation
- Objective-Cでデリゲーションを使う時は、いろいろとチェックが大変だよ
- Swiftだと簡単で安全だよ
Error Reporting
- エラーの詳しい情報が必要な場合、NSErrorPointerが使えるよ
これは、NSErrorを返す型だよ。
大雑把に言うと、Objective-Cの『NSError**』を安全にしたものだよ。
メモ: NSErrorPointerの詳細を確認
- こんな感じで使うことになるよ
var writeError : NSError? let written = myString.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding, error: &writeError) if !written { if let error = writeError { println("write failure: \(error.localizedDescription)") } }
Target-Action
- Target-ActionはSwiftでも同じように使えるよ
Interacting with C APIs
Primitive Types
SwiftはCの基本型と同等の型を用意してるよ
boolに対するCBool、charに対するCCharなど。けど、Swiftの基本型との暗黙の型変換は無いよ
- どうしても必要なときだけCと同等の型を使って、そうでなければSwiftの基本型を使ったほうが良いよ
Enumerations
- 『NS_ENUM』マクロで作ったCの列挙型は、Swiftの列挙型になるよ
この場合、名前のプリフィックスが削除されるよ
Objective-Cだとこう
typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };
- Swiftだとこう
enum UITableViewCellStyle: Int { case Default case Value1 case Value2 case Subtitle }
- 『NS_OPTIONS』マクロで作った列挙型も同じように取り込まれるよ
- この場合、Objective-Cでは身が無いパターンは0になってたけど、Swiftだとnilになるよ
メモ: 要確認
Pointers
- Swiftは、可能な限りポインターを直接触ることを避けてるよ
- けど、ポインターがどうしても必要な場合もあるよ
- そんな時のために、いくつかの型を用意してあるよ
『const void *』に対する『CConstVoidPointer』など。
メモ: いろいろまとめて要確認
Preprocessor Directives
Simple Macros
- CやObjective-Cで『#define』を使って定義してた定数は、Swiftだとグローバル定数を使うよ
Complex Macros
- CやObjective-Cの関数みたいなマクロに相当するものは、Swiftには無いよ
- あれは、型チェックの制約を避けたり、タイピングの繰り返しを省くためのものだよ
Swiftだと関数やジェネリックを使って、もっといいことが出来るよ
Build Configurations
- SwiftとObjective-Cは、条件付きコンパイルで違うところがあるよ
- Swiftはビルド設定に従って条件付きコンパイルが行われるよ
- ビルド設定には、文字列や数値やコマンドラインの設定やプラットフォームを調べる関数とかが含まれるよ
メモ: いろいろ、要確認
#if build configuration statements #else statements #endif
- Cのプリプロセッサと違って、Swiftではどちらの文も構文がチェックされるよ
Mix and Match
Swift and Objective-C in the Same Project
- SwiftとObjective-Cの両方を、1つのプロジェクトで使うことが出来るよ
- これを『Mix and Match』って言うよ
Importing Objective-C into Swift
- Objective-CのファイルをSwiftを使ってるプロジェクトに取り込む場合、Swiftへのブリッジヘッダが必要になるよ
- Xcodeがブリッジヘッダを作るか尋ねてくるから、許可すれば良いよ
- ファイル名は、モジュール名の後ろに『-Bridging-Header.h』を付けたものになるよ
To import Objective-C code into Swift from the same target
- 1.ブリッジヘッダにSwiftで使いたいヘッダファイルを書くよ
#import "XYZCustomCell.h" #import "XYZCustomView.h" #import "XYZCustomViewController.h"
- 2.ブリッジヘッダのビルド設定を確認するよ
コードが生成されるパスは、直接、それ自身を参照するよ。
メモ: 通常は設定を変更する必要はない? 要確認
- ブリッジヘッダに書かれたObjective-Cの要素は、Swiftで自動的に使えるようになるよ
import文は必要ないよ。
Importing Swift into Objective-C
- SwiftのコードをObjective-Cから使う場合、Xcodeが生成したヘッダーファイルが必要になるよ
Importing External Frameworks
- Objective-Cを使って書かれたフレームワークを取り込む事も出来るよ
SwiftとObjective-Cの両方の言語を使ってあっても大丈夫だよ
外部のフレームワークを取り込む場合、『Defines Module』のビルド設定でフレームワークの取り込みをYesにする必要があるよ
メモ: 要確認
Using Swift from Objective-C
- Swiftの機能でObjective-Cからは使えないものもあるよ
Migration
メモ: 特に気になるところはなし
とりあえず終了。 (2014/06/19)