Создание экземпляра базы данных Realm для Swift 2.0-лучшая практика?

мне интересно, какова наилучшая практика создания экземпляра базы данных Realm для Swift 2. Одно из основных различий между Realm для Swift 1.2 и Swift 2 заключается в том, что класс Realm добавил поддержку обработки ошибок. Поэтому этот код на сайте Realm больше не работает:

пусть realm = Realm ()

Я могу придумать пару способов создания экземпляра класса Realm в мире Swift 2:

(1) пусть realm = try! Realm ()

этот опция кажется мне немного "небезопасной", поскольку она потенциально приводит к ошибке выполнения, если класс не создает экземпляр.

(2) Поместите всю операцию Realm (включая создание экземпляра класса) внутри блока Do-Catch

do {
    let realm = try Realm()

    realm.write{realm.add(myObject)}
    }
    catch
    {
        print("Some Realm error")
    }

это определенно работает и определенно безопасно. Однако мне не очень нравится создавать экземпляры класс Царство каждый раз, когда мне нужно выполнить операцию над базой данных. Если я попытаюсь создать "царство" Ивара и поместите его вне Do-Catch блок, переменная выходит за рамки. Например, следующий код не будет компилироваться...

    //IVAR declared outside of Do-Catch...
    let realm:Realm

    do{
        //Get instance of Realm
        realm = try Realm()

        //This write operation works
        realm.write{realm.add(myObject_1)}
    }
    catch
    {
        print("Some Realm error")
    }


    //Create another Dog object
    let myObject_2 = SomeObject()

    //This next line produces an error:  "Variable 'realm' used before being initialized".
    //Initialized 'realm' inside Do-Catch is now out of scope.
    realm.write({
        realm.add(myObject_2)
    })

Я был бы признателен за любую обратную связь (особенно кто-то из Realm) о том, как должна выглядеть лучшая практика работы с Realms в новой среде обработки ошибок Swift 2. Спасибо заранее.

2 ответов


если вы на самом деле не собираетесь обрабатывать ошибки, которые вы получаете, I очень рекомендую использовать try!.

ваш второй фрагмент кода не работает, потому что, если инициализация области не удается, это realm переменная никогда не назначается, что недопустимо. Вы могли бы обойти это путем realm переменной типа Realm?.


имейте в виду, что оба Realm() и write могут бросить. Это означает, что оба они должны попробовать поймать, если вы не используете try!. Вот так:

    do {
        let realm = try Realm()

        do {
            try realm.write {
                realm.add(myObject_1)
            }
        } catch let error {
            print(error)
        }

    } catch let error{

        print(error)
    }