Swift 4 Программирование для фильтрации большого массива с определенным условием - PullRequest
0 голосов
/ 09 мая 2018

учтите, что мой вопрос относится к синтаксису Swift 4 . У меня есть громоздкий / большой массив строк , и я хочу отфильтровать его для получения всех значений в нем, которые начинаются с каких-то определенных символов / подстроки . Это означает, что мне нужно, чтобы каждая строка в моем массиве совпадала с начальной строкой. Я нашел разные ссылки, которые дают мне код для Objective-C , и я не могу реализовать его в Swift 4 , потому что методы недоступны в Swift 4, Я решил свой вопрос вручную, выполнив итерацию моего массива в цикле for, но он дает очень медленный результат. Поэтому я не хочу использовать какой-либо цикл здесь, поэтому любая помощь будет полезна. Заранее спасибо. Смотрите мой код ниже:

func search() -> Void {
        var dummyStringsArray:[String] = ["Hotel Restaurants","Restaurants","Certified Green Restaurant(R)","Japnies Food Restauarants","Grill Restaurants","Restaurant Equipment","Wholsale Restaurant Fixtures","American Food","Wholsale Restaurant Supplies","Veg Restaurants","Barbecue Restaurants","Non-Veg Restaurants"]
        var displayDataArray:[String] = []
        let searchString:NSString = (textField.text!).lowercased() as NSString
        for string in self.dummyStringsArray {
            let mainString:NSString = string.lowercased() as NSString
            if mainString.length >= searchString.length {
                let compareString = String(mainString.substring(to: searchString.length))
                if searchString as String == compareString {
                    displayDataArray.append(string)
                }
            }
        }
    }

Таким образом, если я ввел текст в textField как ' re ', то он должен вернуть displayDataArray, содержащий значения, такие как "Restaurants", "Restaurant Equipment".

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы, вероятно, получите наилучшую производительность, используя range(of:options:), передав параметры .caseInsensitive и .anchored.

func search() -> Void {
    let dummyStringsArray = ["Hotel Restaurants","Restaurants","Certified Green Restaurant(R)","Japnies Food Restauarants","Grill Restaurants","Restaurant Equipment","Wholsale Restaurant Fixtures","American Food","Wholsale Restaurant Supplies","Veg Restaurants","Barbecue Restaurants","Non-Veg Restaurants"]
    let searchString = textField.text!
    let displayDataArray = dummyStringsArray.filter { $0.range(of: searchString, options: [ .caseInsensitive, .anchored ]) != nil }
}
0 голосов
/ 09 мая 2018

Я думаю, что вы не можете сделать это без какого-либо цикла, потому что вам нужно пройти через все элементы

Но я могу предложить вам более элегантное решение с функцией filter:

func search() -> Void {
    let dummyStringsArray:[String] = ["Hotel Restaurants","Restaurants","Certified Green Restaurant(R)","Japnies Food Restauarants","Grill Restaurants","Restaurant Equipment","Wholsale Restaurant Fixtures","American Food","Wholsale Restaurant Supplies","Veg Restaurants","Barbecue Restaurants","Non-Veg Restaurants"]
    let searchString: String = (textField.text!).lowercased()
    let displayDataArray: [String] = dummyStringsArray.filter({ String($0.prefix(searchString.count)).lowercased() == searchString })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...