从plist检索多行

时间:2019-01-29 03:53:35

标签: ios arrays swift xcode plist

我的plist中有一些代码数据。我正在尝试使用Xcode进行阅读。基本上我想检索满足给定条件的多行

使用以下代码,我只能检索1行:但是我不能检索超过1行。例如,我有以下几行

住宿col1 col2 col3 1. a。 b。 C 1. d。 e。 f

print(getDateForDate(date: "1"))

func getSwiftArrayFromPlist(name: String) -> (Array<Dictionary<String,String>>)
        {
        let path = Bundle.main.path(forResource: name, ofType: "plist")
        var arr : NSArray?
        arr = NSArray(contentsOfFile: path!)
        return(arr as? Array<Dictionary<String,String>>)!
    }
    func getDateForDate(date: String) -> (Array<[String:String]>)
    {
        let array = getSwiftArrayFromPlist(name: "file")
        let namePredicate = NSPredicate(format: "Lodging = %@", date)
        return [array.filter{namePredicate.evaluate(with: $0)}[0]]
    }

上面的代码能够检索第1行,但不能检索第2行。我想提取所有符合条件的行。不只是一个

2 个答案:

答案 0 :(得分:0)

首先,不鼓励您使用NSArrayNSDictionary API阅读文章。使用PropertyListSerialization或更好地通过Codable协议将属性列表反序列化为结构。

func getSwiftArrayFromPlist(name: String) -> [[String:String]]
{
    let url = Bundle.main.url(forResource: name, withExtension: "plist")!
    let data = try! Data(contentsOf: url)
    return try! PropertyListSerialization.propertyList(from: data, format: nil) as! [[String:String]]
}

您的谓词过滤数组并返回第一个对象[0],将行更改为

return array.filter{namePredicate.evaluate(with: $0)}

NSPredicate是多余的,在Swift中,您可以直接过滤。而且返回类型周围的括号也是多余的

func getDateForDate(date: String) -> [[String:String]]
{
    let array = getSwiftArrayFromPlist(name: "file")
    return array.filter{ $0["Lodging"]! == date }
}

答案 1 :(得分:0)

谢谢。有帮助。下面是代码:

return array.filter{namePredicate.evaluate(with: $0)}

我有一个返回的字典数组,看起来像这样。

[["a":"1","b":"2","c":3],["a":"3","b":"4","c":5]]

由此,我需要检索键“ a”下定义的任何数据。我该怎么办?

谢谢!