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所说,不建议将RealmList
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 = ""
}