Realm Objective-C & Swift 1.1.0 – Swift 3、Xcode 8に対応
Xcode 7.3.1とSwift 2.2でも引き続きご利用いただけます。できるだけ早くXcode 8とSwift 3またはSwift 2.3に移行することをお勧めします。
Realm Objective‑CおよびRealm Swift 1.1.0をリリースしました。
このバージョンでは、Xcode 8とSwift 2.3、Swift 3.0への対応と、iOS 10、macOS 10.12、tvOS 10およびwatchOS 3をサポートしました。 また、いくつかの互換性に影響のない細かい改善と不具合の修正を含みます。変更点につきましては下記をご覧ください。
Swift 3らしいAPIの改善
ご存知のようにSwift 2.xから3への変更は非常に大きな変化を伴います。
Realm SwiftのパブリックAPIを慎重に精査し、新しい文法とAPIデザインガイドラインに従うように変更しました。ガイドラインにできるだけ従いつつも、変更が大きくなりすぎないように注意深くバランスを保つように修正しましたので、既存のコードに与える影響はそれほど大きくないはずです……?
下記にRealm SwiftがSwift 2.2から3.0に移行する際に必要な変更の例を抜粋します。
// Swift 2.2/2.3
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
migration.renamePropertyForClass(Person.className(), oldName: "yearsSinceBirth", newName: "age")
migration.enumerate(Person.className()) { oldObject, newObject in
// Migrate Person
}
}
)
let realm = try! Realm(configuration: config)
let sortedDogs = realm.objects(Dog.self).filter("color = 'tan'").sorted("name")
let jim = Person()
try! realm.write {
jim.dogs.appendContentsOf(sortedDogs)
}
// Swift 3.0
let config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
migration.renameProperty(onType: Person.className(), from: "yearsSinceBirth", to: "age")
migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
// Migrate Person
}
}
)
let realm = try! Realm(configuration: config)
let sortedDogs = realm.objects(Dog.self).filter("color = 'tan'").sorted(byProperty: "name")
let jim = Person()
try! realm.write {
jim.dogs.append(objectsIn: sortedDogs)
}
複雑になるのを避けるために、ドキュメンテーションやサンプルコード、 APIドキュメントは、まもなくSwift 3を用いた内容に更新されます。
非互換の変更
- Cocoaの標準的な
NSError
の規約に従うためmigrateRealm:
は非推奨になりました。代わりにperformMigrationForConfiguration:error:
を利用してください。 -
RLMResults
に対する添え字を使ったアクセス(Subscripting)はid
型ではなくジェネリック型を返すようになりました。
その他の改善
- Swiftにおいて
NSNumber
型のプロパティを間違って使用した場合のエラーメッセージをわかりやすくしました。 - ビルド済み静的ライブラリの容量が減少しました。
- 非オプショナル(null不可)プロパティに対する並べ替えのパフォーマンスが向上しました。
- 必須プロパティに対するチェックをRealmに保存される直前まで遅延することにより、
initWithValue:
メソッドを使用した部分的なオブジェクトの生成ができるようになりました。
不具合の修正
-
float
型もしくはdouble
型のプロパティに対して、右辺が定数となる条件のクエリを発行した際に、値が間違って切り捨てられる問題を修正しました。 -
Int8
、Int16
、Int32
、Int64
型のプロパティに対して集合関数を使用した際にクラッシュする問題を修正しました。 -
RLMArray
またはList
型のオブジェクトが生成されたスレッドとは別のスレッドで解放された際に、クラッシュを引き起こすレースコンディションを修正しました。 - 通知に登録していたオブジェクトが解放される際に起こるクラッシュを修正しました。
- スキーマが初期化されていない際に
initWithValue:
メソッドをネストしたオブジェクトに対して使用するとクラッシュする問題を修正しました。 - プライマリキーが
RealmOptional
型の場合、一度保存したキーの値を変更できてしまう問題を修正しました。
お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)、 Slack(日本語)、Twitter(日本語)、GitHub(英語)でご相談ください。