iOS
Swift
RealmDay 17

RealmSwiftのコードを読んで勉強になったこと

More than 3 years have passed since last update.


概要

realm-cocoaはオープンソースです。

その中にあるRealmSwiftのコードを読んで、個人的に気になったことをまとめました。


import Realm.Private

モジュールをimport出来るだけでなく、サブモジュールを指定してimport出来ます。

RealmSwiftの場合は下記のような書き方をしている箇所があります。

import Realm

import Realm.Private

また、クラスや変数を指定してimportすることも可能です。

詳しくは公式のリファレンスを参照してください。

The Swift Programming Language: Import Declaration


@objc

Objective-Cから利用するときに、任意の名前に変更出来ます。

この場合だと、ObjectではなくRealmSwiftObjectということになります。

Objective-Cがメインのプロジェクトでは使う機会があるかもしれません。

@objc(RealmSwiftObject)

public class Object: RLMObjectBase {}


autoreleasepool

Swiftでは以下のようにautoreleasepoolを書けるようです。

テストケースで良く使用されていました。

autoreleasepool {

// add object
try! Realm().write {
try! Realm().create(SwiftStringObject.self, value: ["string"])
return
}
}


unsafeBitCast

func unsafeBitCast<T, U>(x: T, _: U.Type) -> U

このメソッドを使えば、指定の型にキャスト出来るようです。

RealmSwiftでは、通常のオブジェクトをRLMObjectにキャストする際に使用しているようです。

unsafeBitCast(object, RLMObject.self)


継承でプロトコルのような挙動?

下記のようなコードを見つけました。

プロトコルのような挙動を継承で実現しているように見えました。 継承元で宣言しているプロパティのgetterは必ずfatalErrorになるようにして、継承先でオーバーライドして実際の処理内容を実装しています。 プロトコルエクステンションでデフォルト実装をしているような印象を持ちました。

private class _AnyRealmCollectionBase<T: Object>: RealmCollectionType {

var realm: Realm? { fatalError() }
}

private final class _AnyRealmCollection<C: RealmCollectionType>: _AnyRealmCollectionBase<C.Element> {
override var realm: Realm? { return base.realm }
}


まとめ

今回はSwiftの部分しか触れてないですが、Objective-CやC++の部分も次回深掘りしたいと思います。

オープンソースだとコードを見れてどのような挙動をするか確認出来るので、非常に素晴らしいですね。