从 plist 读取数组,如果找到匹配项,则只读取 return 项

read array from plist and only return item if match was found

我正在尝试通过 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])

为什么不使用 NSPredicate 来过滤类型?

 let predicate = NSPredicate(format: "genre = 'soft'")!
 let filteredArray = self.menuItems.filteredArrayUsingPredicate(predicate)

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

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

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

另请注意,typecast/check 实际上应该在加载 plist 时一次性完成,而不是在每次构建视图内容时都这样做,它实际上只是为了完整性而包含在代码段中。

也试试这个代码!

if let path = NSBundle.mainBundle().pathForResource("radioChannels", ofType: "plist") {
            if let myArray = NSArray(contentsOfFile: path) {
                for dict in myArray {
                    if let genre = dict["genre"] as? String{

                        if genre == "genre1"  {
                            print("genre1")
                        }
                    }
                }
            }
        }