Swift 2とRealmSwiftでコンパイルエラー: Call can throw, but it is not marked with ‘try’ and the error is not handled

投稿者: Anonymous

サンプルでは以下のようになっています。

// Person model
class Person: Object {
    dynamic var name = ""
    dynamic var birthdate = NSDate(timeIntervalSince1970: 1)
}

// Create a Person object
let author = Person()
author.name = "David Foster Wallace"

// Get the default Realm
let realm = Realm()
// You only need to do this once (per thread)

// Add to the Realm inside a transaction
realm.write {
  realm.add(author)
}

しかし、以下の行がエラーになってしまいます。

let realm = Realm()

特にRealm()の部分のようです。
環境はXCODE7Bata5です。
改善策か、間違いを指摘していただければ幸いです。

一応

import RealmSwift

も、しています。

解決

Swift 2ではエラー処理の方法として新たにtrycatchthrowというキーワードと文法が導入されました。

https://developer.apple.com/swift/blog/?id=29
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html

RealmSwiftのAPIも標準のエラー処理の方法に沿うように、Swift 2からはAPIが変更されていますので、それに合わせて変更する必要があります。

具体的には、Realmをインスタンス化はエラーが起こる可能性(書き込み権限が無い、パスが間違っている、など)のある処理ですので、エラー処理が必要になります。

下記のようにdo-try-catch構文にて何らかのエラーが発生した場合はcatch節でエラー処理をします。

do {
    let realm = try Realm()

    realm.write {
        realm.add(author)
    }
} catch {
    // Error handling...
}

または、エラー処理が不要で無視する場合はtry!を使うこともできます。

let realm = try! Realm()

realm.write {
    realm.add(author)
}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *