2016-11-09 55 views
2

我一直在使用這個擴展我的境界結果成功地映射到的NSDictionary:映射到域結果的NSDictionary錯誤

extension Object { 
func toDictionary() -> NSDictionary { 
    let properties = self.objectSchema.properties.map { $0.name } 
    let dictionary = self.dictionaryWithValuesForKeys(properties) 

    let mutabledic = NSMutableDictionary() 
    mutabledic.setValuesForKeysWithDictionary(dictionary) 

    for prop in self.objectSchema.properties as [Property]! { 
     // find lists 
     if let nestedObject = self[prop.name] as? Object { 
      mutabledic.setValue(nestedObject.toDictionary(), forKey: prop.name) 
     } else if let nestedListObject = self[prop.name] as? ListBase { 
      var objects = [AnyObject]() 
      for index in 0..<nestedListObject._rlmArray.count { 
       let object = nestedListObject._rlmArray[index] as AnyObject 
       objects.append(object.toDictionary()) 
      } 
      mutabledic.setObject(objects, forKey: prop.name) 
     } 
    } 
    return mutabledic 
} 
} 

但現在我試圖映射:

let allObjectLists = realm.objects(UseItemList.self) 
let firstObject = allObjectLists[0].valueForKey("useItems") 
let toDict = firstObject?.toDictionary() //error here 

我如何修復此問題,必須有方法將allObjectLists[0].valueForKey("useItems")映射到字典

以下是我收到的錯誤:

2016-11-10 11:45:09.056 CPS Stocker[6187:167500] -[_TtGC10RealmSwift4ListC11CPS_Stocker7UseItem_ toDictionary]: unrecognized selector sent to instance 0x7fa7f3a49650 
2016-11-10 11:45:09.253 CPS Stocker[6187:167500] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtGC10RealmSwift4ListC11CPS_Stocker7UseItem_ toDictionary]: unrecognized selector sent to instance 0x7fa7f3a49650' 

這裏是我的UseItemList對象類:

class UseItemList: Object { 
    dynamic var dateCreated = NSDate() 
    dynamic var locationUnique = Int() 
    dynamic var MainActivityReference1 = "" 
    dynamic var MainActivityReference2 = "" 
    let useItems = List<UseItem>() 
} 
+3

你得到什麼錯誤? UseItemList的定義是什麼? – Michael

+1

也請分享'UseItemList'類定義 – Dmitry

回答

1

你不是訪問一個Object那裏。

該行代碼let firstObject = allObjectLists[0].valueForKey("useItems")正在拉出useItems對象,該對象是List對象。這就是爲什麼報告沒有可用的方法toDictionary()

如果你想獲得的第一個對象在useItems生成字典關閉該,它應該是:

let allObjectLists = realm.objects(UseItemList.self) // Get all 'UseItemList' objects from Realm as a `Results` object 
let firstObjectInList = allObjectLists.first! // Get the first UseItemList object from the 'Results' object 
let useItemsInFirstObject = firstObjectInList.useItems // Access the 'useItems' List object in the first object 
let firstUseItem = useItems.first! // Access the first item from the 'useItems' List object 
let toDict = firstItem.toDictionary() // Convert the first item into an array 

很明顯,你會凝結下來成一行代碼,但你需要確保你以正確的順序訪問了所有的元素,否則你不會在最後得到正確的Object。 :)

+0

不要抱歉,您無法調用allObjectLists [0] .valueForKey(「useItems」)。first?.toDictionary(),因爲AnyObject沒有「first」成員。通過調用allObjectsLists [0]我已經調用列表中的第一項。 let firstObjectDictionary = allObjectLists [0] .valueForKey(「useItems」)。toDictionary()也給出與我的錯誤相同的錯誤 –

+0

let firstObjectDictionary = allObjectLists.valueForKey(「useItems」)![0] .toDictionary()同樣的錯誤 –

+0

是的,你還沒有在那裏訪問第二行代碼的'Object'。你忘記從'allObjectLists'獲得第一個對象。在這種情況下'allObjectLists'是一個數組,'useItems'是一個數組。你需要確保你正在訪問他們的對象,而不是直接訪問他們,否則你會得到錯誤。我會分幾步分解我的答案。 – TiM

1

這是我如何固定它:

let firstObjectInList = allObjectLists.first! 
    let useItemsInFirstObject = firstObjectInList.useItems 

    for firstUseItem in useItemsInFirstObject { 
     let dit = firstUseItem.toDictionary() 
     usedObjectDictionaries.append(dit) 

    }