在init时,Realm Object子类的实例为null

时间:2015-10-30 15:55:44

标签: ios swift realm

我是iOS开发和swift的新手,我使用Realm进行快速项目。

首先,我创建了一个Realm Object的子类:

class ClassB: Object {

    var id = 0
    var name: String = ""
    let aLotOfA = List<ClassA>()

    override static func primaryKey() -> String? {
        return "id"
    }

}

然后我又上了一堂课:

class ClassC: NSObject {
    static let cManager = ClassC()

    func defaultB() -> ClassB {
        let instanceA = ClassA()
        let instanceB = ClassB()
        instanceB.name = "String"
        instanceB.aLotOfA.append(instanceA)
        return instanceB
    }
}

然后我在某处创建了ClassB的实例:

class ClassD: Object {
    let aB: ClassB = ClassC.cManager.defaultB()
}

我有这堂课:

defaultB()

当我调用let instanceA = ClassA()时,第一行("Object type '(null)' does not match RLMArray type 'ClassA'." )使instanceA为null。我一直在控制台中接收消息,如下所示:

"The `ClassD.aB` property must be marked as being optional."

public class Person {
    private final Set<Person> neighbours = new HashSet<>();
    private final String name;

    public Person(String name) {
        this.name = name;
    }
    public void addNeighbour(Person p)
    {
        neighbours.add(p);
        p.neighbours.add(this);
    }
    public int calculateDistanceTo(Person p)
    {
        return calculateDistanceTo(p, 0, Collections.emptySet());
    }
    private int calculateDistanceTo(Person person, int count, Set<Person> tried)
    {
        if (neighbours.contains(person))
            return count;
        Set<Person> nextTry = new HashSet<>(tried);
        nextTry.add(this);
        return neighbours.stream()
                .filter(p -> !nextTry.contains(p))
                .mapToInt(p -> p.calculateDistanceTo(person, count+1, nextTry))
                .filter(i -> i>=0)
                .findFirst()
                .orElse(-1);
    }
    @Override
    public String toString() {
        return "Person{" + "name=" + name + '}';
    }
}

我不知道这里有什么问题。请有人帮助我,非常感谢。

我的环境:

Mac OS X 10.11.1 + Xcode 7.1

Realm是最新的(刚刚从realm.io下载)

基础SDK:iOS 9.1

部署目标:iOS 9

1 个答案:

答案 0 :(得分:1)

正如zuziaka所指出的,您需要使用List声明所有持久属性。这不适用于RealmOptionalClassA.propA属性。

此外,Realm不支持枚举。您需要将属性Int声明为rawValue并使用class ClassA { var propA: Int = EnumA.ValueA.rawValue … } 初始化其默认值:

ClassD.aB

必须始终将一对一关系标记为可选。这就是属性multiplier的情况。