Realm.io与AnyObject下标

时间:2015-10-02 02:29:37

标签: swift realm

我即将在我的Swift 2.0应用程序中实现Realm模型。但是,一旦我安装了Realm。我的应用程序的AnyObject下标将导致编译错误

  

无法下标“AnyObject”类型的值,其索引类型为“String”

     

无法使用“String”类型的索引下标“RLMProperty”类型的值

     

从'RLMProperty'到'AnyObject'的条件转换总是成功

但事实上,出口不应该是首先是RLMProperty

以下是我的代码

var campaigns = [AnyObject]()

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let campaignCell = tableView.dequeueReusableCellWithIdentifier("campaignCell", forIndexPath: indexPath) as! CampaignTableViewCell

    let outlet: AnyObject = (self.campaigns[indexPath.section]["surveys"]!![indexPath.row])["outlet"]!!


    // Configure the cell...
    campaignCell.outletID.text = outlet["code"] as? String
    campaignCell.outletNameLabel.text = outlet["name"] as? String
    //campaignCell.outletAddressLabel.text = outlet["outlet"]!!["address"] as? String
    campaignCell.outletStatusLabel.text = (self.campaigns[indexPath.section]["surveys"]!![indexPath.row])["progress"]!!["name"] as? String

    campaignCell.outletStatusLabel.textColor = UIColor.colorWithHexString(((self.campaigns[indexPath.section]["surveys"]!![indexPath.row])["progress"]!!["color"] as? String)!)

    return campaignCell
}

1 个答案:

答案 0 :(得分:0)

我自己遇到了这个错误 - 当您希望通过下标访问属性时,诀窍就是不使用AnyObject

有可能,AnyObject的实例已经是某种形式的字典。如果您知道自己的密钥都是字符串,只需将对象转换为[String: AnyObject] - 否则,请使用[NSObject: AnyObject]。您的样本中还有很多力量展开,我担心这只是要求崩溃!那么我将如何重新编写样本呢?

if let campaign = self.campaigns[indexPath.section] as? [String: AnyObject],
    surveys = campaign["surveys"] as? [AnyObject],
    survey = surveys[indexPath.row] as? [String: AnyObject],
    outlet = survey["outlet"] as? [String: AnyObject] {

    // Set up your cell here

}  

长话短说,if-let是你的朋友!没有检查并输入一个铸造!

更好的是,将你的词典映射到类/结构并享受强类型的好处 - 有很多第三方Swift框架可以让这更容易!