Skip to main content
 首页 » 操作系统

ios之从 plist 中读取数组,只有在找到匹配项时才返回项目

2024年01月01日40linjiqin

我正在尝试通过 plist 工作... 现在我只想获取 item 1,如果它是一种 Soft 我该如何实现?

我正在尝试通过它进行排序,但它不起作用...

 var path = NSBundle.mainBundle().pathForResource("radioChannels", ofType: "plist") 
    self.menuItemArray = NSMutableArray(contentsOfFile: path!) as NSMutableArray! 
    for obj: AnyObject in menuItemArray { 
        if let dict = obj as? NSDictionary { 
            if let menuPunkt = dict["genre"] as? String { 
                if menuPunkt as String == ("Soft"){ 
                    println("Soft \(menuPunkt)") 
                } 
            } else { 
                println("failed with menuPunkt") 
            } 
        } else { 
            println("failed to convert to NSDictionary") 
        } 
    } 

这个我只试过但确实有效

    var descriptor: NSSortDescriptor = NSSortDescriptor(key: "Soft", ascending: true) 
    self.sortedResults = menuItemArray.sortedArrayUsingDescriptors([descriptor]) 

请您参考如下方法:

如评论中所述,使用内置过滤器。以下代码段将为您提供一系列类型为“软”的项目:

if let menuItemArray = menuItemArray as? [[String:AnyObject]] { 
    var softItems = menuItemArray.filter({ 
        if let genre = $0["genre"] as? String { 
            return genre.lowercaseString == "soft" 
        } 
        return false 
    }) 
    println("\(softItems)") 
} 

我更喜欢这个解决方案而不是 NSPredicate 解决方案有几个原因,首先,一旦你将 NSMutableArray 类型转换为适当类型的 swift 数组,它几乎是纯粹的 swift,其次,NSPredicate对于一个非常简单的问题来说是一个相当沉重的 Objective-C bat 。

另请注意,类型转换/检查实际上应该在加载 plist 时一次性完成,而不是在每次构建 View 内容时都进行,它实际上只是为了完整性而包含在代码段中。