2014-10-21 5 views
0

Кажется, что большинство людей с этой ошибкой пытаются создать нулевые строки. Я просто три свойстваSwift: ошибка Realm при инициализации «NULL не поддерживается как свойство RLMObject». Но у меня нет NULL

dynamic var babyEvent: Int 
dynamic var eventDate: NSDate 
dynamic var timeSpent: Int 

, которые инициализируются в инициализации() в

override init() 
{ 
    self.babyEvent = BabyWet 
    self.eventDate = NSDate() 
    self.timeSpent = 5 
    super.init() 
} 

, но к тому времени super.init() называется я «(нуль)» не поддерживается свойство RLMObject.

Существует два входа и один NSDate, все из которых являются действительными типами свойств Realm. Так почему я получаю эту ошибку?

+0

Супер звонки должны нормально быть всегда первым делом можно назвать в большинстве объектно-ориентированных языков. Является ли super.init() ожидающим каких-либо данных? –

+0

Я тоже так думал, но выполнение вызова super.init() сначала приводит к ошибке времени компиляции. «Свойство» не инициализируется при вызове super.init(). –

+1

@ user3427079 Swift отличается, вы не можете вызывать из инициализатора до тех пор, пока не будут инициализированы все локальные свойства, поэтому вызов super после того, как локальные свойства задают свои значения. – Anorak

ответ

0

В Swift Enums есть определенный тип. Поэтому, пока вы думаете, что передаете Int для BabyWet, вы фактически передаете что-то определенного типа.

Похоже, что у вас есть Enum для BabyEvent, так что вы действительно должны взглянуть на rawValue собственности:

self.babyEvent = BabyWet.rawValue 
+0

BabyWet определяется как «let BabyWet = 1». Раньше у меня было перечисление, и он был вызван раньше, чем Realm как недействительный тип Realm, поэтому я его изменил. В настоящее время у BabyWet нет свойства rawValue, которое я могу использовать. –

0

Как я уже писал, вы можете просто установить начальные значения в определениях модели:

class TestClass: RLMObject { 
    dynamic var babyEvent: Int = 1 
    dynamic var eventDate: NSDate = NSDate() 
    dynamic var timeSpent: Int = 5  
} 

, но это также работает для меня:

class TestClass: RLMObject { 
    dynamic var babyEvent: Int 
    dynamic var eventDate: NSDate 
    dynamic var timeSpent: Int 

    override init() { 
     babyEvent = 1 
     eventDate = NSDate() 
     timeSpent = 5 
     super.init() 
    } 
} 

в обоих случаях Я просто использую

let realm = RLMRealm.defaultRealm() 

var myTestObject = TestClass() 

realm.beginWriteTransaction() 
realm.addObject(myTestObject) 
realm.commitWriteTransaction() 

для создания и добавления объекта в Царство.

1

Realm не поддерживает Swift enum без исходного значения. Но добавление исходного типа к BabyEvent перечислению и назначая необработанное значение в вашу области объектов работы:

enum BabyEvent: Int { 
    case BabyWet, case BabyDry 
} 
class MyRealmObject: RLMObject { 
    dynamic var babyEvent = BabyEvent.BabyWet.rawValue 
    dynamic var eventDate = NSDate() 
    dynamic var timeSpent = 0 
}