Realm Blog

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型のプロパティに対して、右辺が定数となる条件のクエリを発行した際に、値が間違って切り捨てられる問題を修正しました。
  • Int8Int16Int32Int64型のプロパティに対して集合関数を使用した際にクラッシュする問題を修正しました。
  • RLMArrayまたはList型のオブジェクトが生成されたスレッドとは別のスレッドで解放された際に、クラッシュを引き起こすレースコンディションを修正しました。
  • 通知に登録していたオブジェクトが解放される際に起こるクラッシュを修正しました。
  • スキーマが初期化されていない際にinitWithValue:メソッドをネストしたオブジェクトに対して使用するとクラッシュする問題を修正しました。
  • プライマリキーがRealmOptional型の場合、一度保存したキーの値を変更できてしまう問題を修正しました。

お読みいただきありがとうございます。 Realm で素晴らしいアプリケーションを作りましょう!お困りの際はStack Overflow(日本語)Slack(日本語)Twitter(日本語)GitHub(英語)でご相談ください。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る