2016-02-01 28 views
0

您好我正在使用SQLiteDB來訪問我寫的移動應用程序中的SQLiteDB。我開始編寫一個小模型類來接收SQLiteDB返回的行,並使它們可以方便地訪問我的程序的其餘部分。但是,當我嘗試開始結果時,我收到一個我不明白的錯誤。不能安全字典變成

這是我試圖運行

import Foundation 

class DBModel { 
    static let db = SQLiteDB.sharedInstance() 

    required init(attributeParams: [String: Any]) { 
     let attrbitues = attributeParams 
    } 

    class func all() -> [DBModel] { 
     let rawAttributes = db.query("select * from \(tableName())") 
     print(self) 
     var objects = [DBModel]() 

     for record in rawAttributes { 
      print(record) 
      objects.append(self.init(attributeParams: record)) 
     } 

     return objects 

    } 
} 

當我運行這段代碼我得到這個錯誤代碼:從這一行objects.append(self.init(attributeParams: record))fatal error: can't unsafeBitCast between types of different sizes: 我得到的錯誤是。 print(record)的輸出是["id": 1, "name": Josh]

我對Swift非常陌生。但是,我認爲這可能與SQLiteDB查詢返回含有可選值的散列有關。但是,我不知道要解決它。

感謝,

喬希

+0

好的,這裏感覺很蠢。我將'[String:Any]'改成了'[String:AnyObject?]',它似乎已經刪除了它們的錯誤。但是,不知道爲什麼。如果你能幫我理解Any和AnyObject之間的區別,我將不勝感激。 –

回答

3

db.query回報[[String:AnyObject]]。然後你重複這個,所以record的類型是[String:AnyObject]。然後嘗試將其傳遞給類型爲[String: Any]的參數,但AnyObjectAny的子集。這個錯誤有點令人困惑,但與斯威夫特在詞典上缺乏協變有關。 [String:Cat]不是[String:Animal]的子類型。同樣,[String: AnyObject]不是[String: Any]的子類型。

對於您的問題Any vs AnyObject,Any字面上是Swift已知的任何類型。 AnyObject只是「對象類型」。許多事情不是對象類型。實際上,對象是Swift中的類,但是如果導入Foundation,則會出現一些令人驚訝的規則彎曲。沒有Foundation,字符串不是AnyObject。使用Foundation時,字符串被隱式轉換爲NSString,這是一個類,因此是AnyObject。但大多數情況下,您可以將AnyObject視爲「班級和類似事物」。