如何提取 __NSArrayM 中的每个元素?

Posted

技术标签:

【中文标题】如何提取 __NSArrayM 中的每个元素?【英文标题】:How do I extract each element in __NSArrayM? 【发布时间】:2018-01-16 02:49:44 【问题描述】:

我正在使用 Firestore(仍处于测试阶段),我的数据结构如下:

我想以字符串的形式获取每种成分,以使用它们的名称创建成分类的对象。这是我正在使用的方法:

private func loadIngredients()
    let db = Firestore.firestore()
    let recipeCollectionRef = db.collection("dishes").document((recipe?.name)!)
    recipeCollectionRef.getDocument  (document, error) in
        if let document = document 
            print("Document data: \(document.data())")
            print("\(document.data().values)")
            for value in document.data().values 
                print("Value: \(value)")
                print(type(of: value))
            
         else 
            print("Document does not exist")
        
    

这目前产生:

文档数据:[“成分”:<__nsarraym>( 香蕉, 麦片 ) ,“级别”:容易] LazyMapCollection, Any>(_base: ["ingredients": <__nsarraym>( 香蕉, 麦片 ) , "级别": 容易], _transform: (函数)) 价值: ( 香蕉, 麦片 ) __NSArrayM 价值:容易 NSTaggedPointerString

根据我阅读 Apple 关于字典的文档的理解: 我的字典的类型为 [String: Any],在这种情况下,“成分”是充当键的字符串,值可以是任何对象。我正在使用的数组是一个可变数组。

对于如何获取该数组及其各自的元素,我感到非常困惑。我尝试从 LazyMapCollection 转换为 String ,但这会将整个数组生成为字符串。我还尝试通过键“成分”访问该值,但这不能作为“无法使用String 类型的索引下标LazyMapCollection&lt;[String : Any], Any&gt; 类型的值

【问题讨论】:

【参考方案1】:

正如你所说,document.data() 是一个字典 ([String:Any])。

所以从那开始:

if let document = document, let data = document.data() as? [String:Any] 

现在如果你想访问成分数组,你可以这样做:

if let ingredients = data["ingredients"] as? [String] 

你会得到:

private func loadIngredients()
    let db = Firestore.firestore()
    let recipeCollectionRef = db.collection("dishes").document((recipe?.name)!)
    recipeCollectionRef.getDocument  (document, error) in
        if let document = document, let data = document.data() as? [String:Any] 
            // Get the ingredients array
            if let ingredients = data["ingredients"] as? [String] 
                // do whatever you need with the array
            

            // Get the "easy" value
            if let east = data["easy"] as? String 
            
         else 
            print("Document or its data does not exist")
        
    

【讨论】:

感谢您的回答。我现在才有机会测试它。我现在可以打印出每个成分对象的名称,这意味着您的解决方案有效。 如果我想启动同时获取多个属性的对象。你的这部分代码可以:if let ingredients = data["ingredients"] as 吗? [String] // 对数组做任何你需要的事情 扩展成这个?如果让成分=数据[“成分”]作为? [String], let ease = data["easy"] as? String // 处理

以上是关于如何提取 __NSArrayM 中的每个元素?的主要内容,如果未能解决你的问题,请参考以下文章

[__NSArrayM intValue]:发送到实例的无法识别的选择器

SBJson 解析后的执行 (__NSArrayM objectForKey:)

NSArrayM 中的异常 insertObject:atindex

Xcode -[__NSArrayM isEqualToString:]:无法识别的选择器发送到实例 0x7a1248d0 - 如何修复?

目标c [__NSArrayM objectForKey:]:发送到实例的无法识别的选择器

如何在我的场景中纠正此错误_NSArrayM objectAtIndex:]: index 8 beyond bounds [0 .. 7]'