Получение нескольких строк из списка - PullRequest
0 голосов
/ 29 января 2019

У меня есть некоторые данные кода, которые есть в моем списке.Я пытаюсь прочитать это с помощью Xcode.По сути, я хочу получить несколько строк, которые удовлетворяют заданному условию

Я могу получить только 1 строку, используя следующий код: но я не могу получить более 1 строки.Например, у меня есть следующие строки

Жилье col1 col2 col3 1. ab c 1. de 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 голосов
/ 30 января 2019

Спасибо.Это помогло.Ниже приведен код:

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

У меня есть возвращенный массив словарей, который выглядит следующим образом.

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

Из этого мне нужно получить данные для всего, что определено под ключом "a».Как мне это сделать?

спасибо!

0 голосов
/ 29 января 2019

Прежде всего, вам не рекомендуется читать списки с API NSArray или NSDictionary.Используйте 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 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...