Jun 162014
SwiftとObjective-Cの組み合わせ方のまとめ。相互運用では何が出来て何が出来ないのか。Swiftでクラスを記述する際の基礎知識の整理。必要最低限の属性。ゲッターとセッター。プロパティ。初期化と解放。
SwiftとObjective-Cの相互運用
Appleが互換性をもたせ組み合わせて使える言語にした理由は、
- Objective-Cで、今まで親しんだ手法(言語の挙動や動作の取り扱いができる)をベースに
- Swiftの持つ、モダンな最新の言語機能を活かしつつ
クラスを記述すること。 前回はSwiftとObjective-Cの互換性やそれぞれから機能をどのように利用するか相互運用について概要を書いたので、パート2は掘り下げて記述する。
Objective-Cクラスの継承
- Objective-Cクラスを継承する場合、コロン(:)を使う
- Swiftクラス名→コロン→Objective-Cクラス名の順
- スーパークラスの機能をすべて利用できる
- 自クラスでメソッドを再定義したい場合はoverrideキーワード
class MyViewController : UIViewController { override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) } }
プロトコル(protocol)適用
- カンマ(,)区切りでプロトコルを並べる
- 複数並べられる
- スーパークラスの後にカンマしてプロトコルを続ける
- Swiftでは、クラスやプロトコルのネームスペース(namespace)は統一される
- Objective-CのNSObjectプロトコルはSwiftではNSObjectProtocolに割り当て
class MyViewController : UIViewController, UITableViewDelegate { }
初期化/解放
- Swiftでは、クラス中のプロパティを初期化しないまま放置しない
- Swiftでは、Objective-Cと違い、分割メモリ割当メソッドは存在しない
- Swiftでは、Objective-Cの初期化メソッドをSwiftに変換するため、Objective-Cクラスを利用してる場合でもSwiftの記法で初期化(initializer)できる
- Swiftでは、クラスがメモリ解放される前にクリーンナッププロセスを追加する場合はObjective-Cのdeallocメソッドの代わりに解放メソッド(deinitializer/finalizerのようなもの)を実装出来る
- Swiftでは、インスタントがメモリ解放される前に自動的にこの解放メソッド呼び出される
- Objective-Cから派生したSwiftクラスを使っている場合、Objective-Cクラスを使っている場合、いずれの場合もSwiftは親クラスの(Objective-Cの)deallocメソッドを呼び出す
class MyView { init(frame : Frame) { } deinit{ } }
Interface Builder
- IBの機能をSwiftのclassから利用出来る属性(attributes)がある
- アウトレット(@IBOutlet)
- アクション(@IBAction)
- ライブレンダリング(@IBDesignable / @IBInspectable)
@IBOutlet
- プロパティ定義の前に@IBOutlet
- コレクション(複数)のアウトレットを定義するためにも@IBOutletを利用可能
- Swiftでアウトレットを定義すると型が割り当てられる(弱参照/オプション/nil)
@IBOutlet var button: UIButton @IBOutlet var textFields: UITextField[]
@IBAction
- メソッド定義の前に@IBAction
@IBAction func buttonTapped(AnyObject) { println("button tapped!") }
@IBDesignable
- InterfaceBuilderの中でインタラクティブにビューのデザインができるようになる。
- UIViewやNSViewからカスタムなビューを作る場合、クラス定義の前に@IBDesignableを付ける事が出来る。
- InterfaceBuilderにそのカスタムビューを設置(インスペクタでそのビューのクラスを設定)すると、キャンバスにレンダリングされるようになる。
@IBInspectable
- プロパティ定義の前に@IBInspectableを付ける
- ユーザ定義のランタイム属性と互換性がある
- InterfaceBuilderにカスタムビューを追加すると、インスペクタでプロパティを編集出来る
@IBDesignable class MyCustomView: UIView { @IBInspectable var textColor: UIColor @IBInspectable var iconHeight: CGFloat }
プロパティ属性
参照属性について
- Swiftではデフォルトは強参照となる
- オブジェクトへの弱い参照は、弱参照(weak)属性をつかう
class Message { var title : String = "Hello" } class Mail { var from : String = "You" var to : String = "Me" var msg : Message? weak var weakmsg : Message? init() { self.msg = Message() self.weakmsg = Message() //弱い参照なので保持されない } } Mail().msg?.title //"Hello" Mail().weakmsg?.title //nilとなった
読み書き属性について
1)値格納用プロパティ
- readwrite(読み書き用)には変数(var)属性
- readonly(書き込み不可)には定数(let)属性をつけて定義
- readwriteやreadonlyといった属性名は存在しない
varとletを付加するだけ:
var firstValue: Int let length: Int
2)計算結果用プロパティ
- readwrite(読み書き用)にはgetter/setter両方定義
- readonly(書き込み不可)にはgetterのみを定義
readwriteの場合(setのパラメータは省略でき、省略時の入力パラメータ名はnewValueが暗黙的に指定される):
var origin = Point() //値格納用途 var size = Size() //値格納用途 var center: Point { get { let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX, y: centerY) } set(newCenter) {//newCenter(Point型)は入力パラメータ origin.x = newCenter.x - (size.width / 2) origin.y = newCenter.y - (size.height / 2) } }
readonlyの場合(getを省略した形でOK):
var width = 0.0, height = 0.0, depth = 0.0 var volume: Double { return width * height * depth }
コピー
- Ojbective-Cのcopy属性は@NSCopyingに該当
- NSCopyingプロトコルに合わせて実装が必要
CoreData(@NSManaged)
- モデル(CoreDataModel)の属性や関連に合わせて、それぞれのプロパティ定義に@NSManagedをつける
- Objective-Cの@dynamicと同じ
- @NSManagedは実行時にプロパティの実装が与えられる事を示す
- @dynamicと違って@NSManagedはCoreDataでのみ利用可能な属性である
コメント
Powered by Facebook Comments
3 Responses to “Objective-CとSwiftの組み合わせ方のまとめPart2”
Sorry, the comment form is closed at this time.
まとまってる:
Objective-CとSwiftの組み合わせ方のまとめPart2 http://t.co/AyUawlws8g
メモ: Objective-CとSwiftの組み合わせ方のまとめPart2 http://t.co/iZlfsQlGjx
Objective-CとSwiftの組み合わせ方のまとめPart2 – http://t.co/aQoIMwbhpP