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