Ios 使用swift 3将数组添加到域中

Ios 使用swift 3将数组添加到域中,ios,arrays,swift,realm,Ios,Arrays,Swift,Realm,我是一个新的领域,我尝试添加一个数组,就像我对字符串所做的那样,但最终还是出现了一些错误。因此,经过一番搜索,我找到了一个解决方案: class Sensors : Object { dynamic var name = "" dynamic var message = "" var topic: [String] { get { return _backingNickNames.map { $0.stringValue }

我是一个新的领域,我尝试添加一个数组,就像我对字符串所做的那样,但最终还是出现了一些错误。因此,经过一番搜索,我找到了一个解决方案:

class Sensors : Object {


    dynamic var name = ""
    dynamic var message = ""

    var topic: [String] {
        get {
            return _backingNickNames.map { $0.stringValue }
        }
        set {
            _backingNickNames.removeAll()
            _backingNickNames.append(objectsIn: newValue.map({ RealmString(value: [$0]) }))
        }
    }
    let _backingNickNames = List<RealmString>()

    override static func ignoredProperties() -> [String] {
        return ["topic"]
    }




}

class RealmString: Object {
    dynamic var stringValue = ""
}
class传感器:对象{
动态变量名称=“”
动态var message=“”
变量主题:[字符串]{
得到{
返回_backing昵称.map{$0.stringValue}
}
设置{
_backing昵称。removeAll()
_backing昵称.append(objectsIn:newValue.map({RealmString(value:[$0])}))
}
}
让_backing昵称=列表()
重写静态函数ignoredProperties()->[字符串]{
返回[“主题”]
}
}
类RealmString:Object{
动态变量stringValue=“”
}
这很好,现在我想在这个类中添加另一个数组。 如果有人知道用realm添加数组的其他方法,请分享


提前感谢

作为一般规则,使用Realm提供的一对多关系比使用数组模拟关系更有效(Realm的集合是惰性的,包含的对象仅在需要时实例化,而不是普通的Swift数组)

在您的情况下,如果我正确理解您正在尝试执行的操作,您希望将
[RealmString]
Swift数组添加到
\u backing昵称
列表中

为什么不使用Realm的
List
类(请参见)的
append(objectsIn:)
方法,如下所示:

// Dog model
class Dog: Object {
    dynamic var name = ""
    dynamic var owner: Person?
}

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

    let dogs = List<Dog>()
}

let jim = Person()

let dog1 = Dog()
let dog2 = Dog()

// here is where the magic happens
jim.dogs.append(objectsIn: [dog1, dog2])
•••••••••••

回到您的应用程序,您可以轻松地重构模型以适应这种情况。每个
传感器
对象可以连接多个
主题
和多个
消息
对象

只需放弃
消息
主题
计算属性,分别将
topicV
messageV
重命名为
主题
消息
。同时将
RealmString
重命名为
Topic
RealmString1
重命名为
Message

现在,您可以轻松地反复阅读传感器上的主题,例如:

for topic in sensor1.topics { ... }
或者,如果要将消息附加到传感器,可以执行以下操作(不要忘记先将新创建的对象附加到DB):


因此,无需使用中间Swift数组。

bogdanf所说的,以及您实现它的方式都是正确的

除了基本值类型之外,Realm只能存储对单个Realm
Object
对象的引用,以及使用
列表
类型的
Object
s数组。因此,如果您想要保存一个类型数组,那么有必要将您想要保存的任何基本类型(如
字符串
)封装在一个方便的领域
对象

正如bogdanf所说,不建议将Realm
List
s转换为标准Swift数组,然后再转换回来,因为您会失去Realm延迟加载功能的优势(这可能会导致性能和内存问题),但内存问题至少可以通过将复制数据的代码封装在
@autoreleasepool
块中来缓解

class MyObject: Object {
    dynamic var childObject: MyObject?
    let objectList = List<MyObject>()
}
类MyObject:Object{
动态对象:MyObject?
让objectList=List()
}

因此,在回顾中,最好的做法是尽可能直接使用领域
列表
对象,并在任何时候使用
@autoreleasepool
在领域中的每个子对象中循环。:)

测试后,我设法添加了另一个类似这样的阵列:

class Sensors : Object {


    dynamic var type = ""
    dynamic var name = ""
    dynamic var badge = 0

    var topic: [String] {
        get {
            return topicV.map { $0.stringValue }
        }
        set {
            topicV.removeAll()
            topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) }))
        }
    }

    var message: [String] {
        get {
            return messageV.map { $0.stringValue1 }
        }
        set {
            messageV.removeAll()
            messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) }))
        }
    }





    let topicV = List<RealmString>()
    let messageV = List<RealmString1>()

    override static func ignoredProperties() -> [String] {
        return ["topic", "message"]
    }




}

class RealmString: Object {
    dynamic var stringValue = ""
}

class RealmString1: Object {
    dynamic var stringValue1 = ""
}
class传感器:对象{
动态变量类型=“”
动态变量名称=“”
动态变量=0
变量主题:[字符串]{
得到{
返回topicV.map{$0.stringValue}
}
设置{
topicV.removeAll()
append(objectsIn:newValue.map({RealmString(值:[$0])}))
}
}
var消息:[字符串]{
得到{
返回messageV.map{$0.stringValue1}
}
设置{
messageV.removeAll()
append(objectsIn:newValue.map({RealmString1(值:[$0])}))
}
}
让topicV=List()
让messageV=List()
重写静态函数ignoredProperties()->[字符串]{
返回[“主题”、“消息”]
}
}
类RealmString:Object{
动态变量stringValue=“”
}
类RealmString1:Object{
动态变量stringValue1=“”
}

使用列表有什么问题吗?没有,正如我说的,我是新来的,我没有所有的选择谢谢你的回答,我会检查一下,看看这是否是我想要的want@mikevorisis字体我只是好奇这是否对你有帮助。事实上,经过一点搜索和测试,我终于明白了这是如何工作的,我发现你的方法比我的容易,所以我将您的问题标记为最佳答案!再次感谢你!迈克,不太清楚你为什么要在领域列表和Swift数组之间来回转换?这是非常低效的,并且给你的代码增加了不必要的复杂性。我不明白如何使用其他方法。我已经更新了我的答案,以展示一种可能的方法来正确重构你的代码,以便利用模型中使用的完整领域对象和关系。
class MyObject: Object {
    dynamic var childObject: MyObject?
    let objectList = List<MyObject>()
}
class Sensors : Object {


    dynamic var type = ""
    dynamic var name = ""
    dynamic var badge = 0

    var topic: [String] {
        get {
            return topicV.map { $0.stringValue }
        }
        set {
            topicV.removeAll()
            topicV.append(objectsIn: newValue.map({ RealmString(value: [$0]) }))
        }
    }

    var message: [String] {
        get {
            return messageV.map { $0.stringValue1 }
        }
        set {
            messageV.removeAll()
            messageV.append(objectsIn: newValue.map({ RealmString1(value: [$0]) }))
        }
    }





    let topicV = List<RealmString>()
    let messageV = List<RealmString1>()

    override static func ignoredProperties() -> [String] {
        return ["topic", "message"]
    }




}

class RealmString: Object {
    dynamic var stringValue = ""
}

class RealmString1: Object {
    dynamic var stringValue1 = ""
}