【问题标题】:Retrieving multiple rows from plist从 plist 中检索多行
【发布时间】:2019-01-29 03:53:35
【问题描述】:

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

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

住宿 col1 col2 col3 1.一个。湾。 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 行。我想提取所有符合条件的行。不止一个

【问题讨论】:

    标签: ios arrays swift xcode plist


    【解决方案1】:

    首先,不鼓励您使用 NSArrayNSDictionary API 阅读 plist。使用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 }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      谢谢!

      【讨论】:

      • 再一次,NSPredicate 是多余的。
      • '[String : String]' 类型的值没有成员 'Lodging' 当我使用 return array.filter{ $0.Lodging == date } 时出现此错误
      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 2015-04-24
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2015-12-16
      • 1970-01-01
      相关资源
      最近更新 更多