将域列表<objects>转换为数组[bojects]

时间:2017-09-04 09:13:37

标签: swift3 realm

我有2个包含属性

的领域对象类AlertRSM和AlertRSMList
class AlertRSM : Object{

    var alertType : String?
    var alertTypeValue : String?
    var period : String?
    var colorValue : String?
    var tableName : String?
}

class AlertRSMList: Object {
    dynamic var companyAlt_Key :String?
    dynamic var dbEntryDate :String?

    var arrayOfAlertRSM = List<AlertRSM>()
}

我已经在领域数据库中拥有数据,并且像

一样获取它
let alertRSMList = realm.objects(AlertRSMList.self)
    let selectedAlertRSMList : [AlertRSMList] = alertRSMList.filter { alertRSM in
    return alertRSM.companyAlt_Key == _companyAlt_Key
}

我在selectedAlertRSMList中获取记录。现在我想得到AlertRSM数组形式selectedAlertRSMList,因为我做了以下

if selectedAlertRSMList.count > 0 {
    /*var alertRSM = [AlertRSM]()
    let alertList = selectedAlertList[0].arrayOfAlertRSM
    for item in alertList {
       alertRSM.append(item) 
    }
    // print(alertRSM.count) // here I am getting 9 count but all items are nil
    */
    let alertList = selectedAlertList[0].arrayOfAlertRSM
     print(alertList) // I am getting all records 
     print(alertList[0].alertType)// here I am getting nil but that is exist in alertList and also printed by print(alertList)
}

通过打印alertList

 print(alertList)

我正在获得像

这样的记录
List<AlertRSM> <0x6000002e0500> (
[0] AlertRSM {
    alertType = Financial;
    alertTypeValue = 37.0;
    period = W;
    colorValue = 008000;
    tableName = Alert;
},
[1].....so on

但是当我试图打印时

print(alertList[0].alertType)

我正在打印

nil

请建议我 帮助将不胜感激: - )

1 个答案:

答案 0 :(得分:1)

您需要使用dynamic关键字声明Realm模型类的所有实例属性,以用作存储的Realm属性。这是Objective-C互操作性所必需的,因为Realm框架使用Obj-C运行时环境。

将所有属性声明为dynamic后,您的代码就可以正常运行。

class AlertRSM : Object {
    dynamic var alertType : String?
    dynamic var alertTypeValue : String?
    dynamic var period : String?
    dynamic var colorValue : String?
    dynamic var tableName : String?
}

如果您在类的实例上运行代码而不是在Realm中持久存在,则可以清楚地看到问题。在那些,您的代码完美地工作,因为它们不是通过Obj-C运行时访问的。只要您持久保存模型对象,就可以看到问题。

来自Realm docs:

  

Realm模型属性必须具有@objc动态var属性   成为底层数据库数据的访问者。

     

这有三个例外:LinkingObjects,List和   RealmOptional。这些属性不能声明为动态,因为   通用属性无法在Objective-C运行时中表示,   用于动态分配动态属性。这些   应始终使用let声明属性。