2017-02-12 186 views
0

我使用斯威夫特与火力地堡和我感到困惑的这个错误点点价值:Could not cast value of type '__NSDictionaryM' (0x122ab6130) to 'Repeat.Expression' (0x1100004c0).斯威夫特和火力地堡 - 无法投型“__NSDictionaryM”

这里是JSON文件的示例中,我使用:

{ 
    "levels" : { 
    "level1" : { 
     "coverImage" : "lvl1", 
     "expressions" : [ { 
     "expression" : "Yes", 
     "id" : 0 
     }, { 
     "expression" : "Yes", 
     "id" : 1 
     }, { 
     "expression" : "Yes", 
     "id" : 2 
     }, { 
     "expression" : "Yes", 
     "id" : 3 
     } ], 
     "id" : 0, 
     "title" : "Essentiel" 
    }, 
    "level2" : { 
     ... 
    }, 
    } 
} 

这里有两种模式使用:

struct Level { 
    let id : Int 
    let coverImage : String 
    let title : String 
    let expressions : [Expression] 
} 

struct Expression { 
    let id : Int 
    let expression : String 
} 

最后,这里是我用来获取级别的功能:

var levels = [Level]() 

func fetchLevels() { 

     FIRDatabase.database().reference().child("levels").observe(.childAdded, with: { (snapshot) in 

      if let dictionary = snapshot.value as? [String: AnyObject] { 

       if let levelId = dictionary["id"], let levelCoverImage = dictionary["coverImage"], let levelTitle = dictionary["title"], let levelExpressions = dictionary["expressions"] { 
        let level = Level(
         id: levelId as! Int, 
         coverImage: levelCoverImage as! String, 
         title: levelTitle as! String, 
         expressions: levelExpressions as! [Expression] 
        ) 
        self.levels.append(level) 
       } 


       DispatchQueue.main.async{ 
        self.collectionView?.reloadData() 
       } 


      } 
     }, withCancel: nil) 
    } 

看来,这个问题是在该行expressions: levelExpressions as! [Expression]

非常感谢您的帮助。

祝您有美好的一天。

+1

分配Expression对象'levelExpressions'是NSDictionaries的阵列不是你表达类;你需要从字典中显式地创建'Expression'的实例。 – Paulw11

回答

1
let levelExpressions = dictionary["expressions"] 

上面一行返回字典的阵列,即[[String:Any]],需要要求值被映射到你的结构Expression.This可以通过两种方式来完成: -

1)您可以使用ObjectMapper来类型化上述代码的返回值。

2)手动通过解析的0​​let levelExpressions = dictionary["expressions"] as! [[String:Any]]返回值和将它们分配给属性idexpression

相关问题