Для поиска строки, включенной в структуру, я использую:
let results = myArray.filter( {$0.model.localizedCaseInsensitiveContains("bu")} )
Но предположим, что у структуры есть несколько свойств, по которым я хотел бы выполнить поиск - или, может быть, я бы даже хотел выполнить поиск по всем из них одновременно. Я могу фильтровать только примитивные типы, поэтому не использовать «модель».
Решение -------------------------
Хотя мне очень понравилась идея использовать ключевые пути, как предложил Мэтт ниже, в итоге я добавил функцию в свою структуру, которая сделала мой код контроллера представления намного чище:
struct QuoteItem {
var itemIdentifier: UUID
var quoteNumber: String
var customerName: String
var address1: String
func quoteItemContains(_ searchString: String) -> Bool {
if self.address1.localizedCaseInsensitiveContains(searchString) ||
self.customerName.localizedCaseInsensitiveContains(searchString) ||
self.quoteNumber.localizedCaseInsensitiveContains(searchString)
{
return true
}
return false
}
Затем в моем контроллере кавычки - это массив QuoteItem, который я могу искать, просто написав:
searchQuoteArray = quotes.filter({ $0.quoteItemContains(searchString) })





Надеюсь, я правильно вас понял. Я думаю, с помощью этого фрагмента кода вы можете добиться того, чего хотите:
struct ExampleStruct {
let firstSearchString: String
let secondSearchString: String
}
let exampleOne = ExampleStruct(firstSearchString: "Hello", secondSearchString: "Dude")
let exampleTwo = ExampleStruct(firstSearchString: "Bye", secondSearchString: "Boy")
let exampleArray = [exampleOne, exampleTwo]
let searchString = "Hello"
let filteredArray = exampleArray.filter { (example) -> Bool in
// check here the properties you want to check
if (example.firstSearchString.localizedCaseInsensitiveContains(searchString) || example.secondSearchString.localizedCaseInsensitiveContains(searchString)) {
return true
}
return false
}
for example in filteredArray {
print(example)
}
Это напечатает следующее в Playgrounds:
ExampleStruct(firstSearchString: "Hello", secondSearchString: "Dude")
Сообщите мне, если это поможет.
У меня есть десять свойств в моей структуре, которые я хотел бы найти, поэтому я думаю, что приведенный выше пример быстро станет повторяющимся. Но я ценю ответ!
Звучит как работа для Swift ключевые пути. Просто укажите ключевые пути для свойств String, которые вы хотите найти.
struct MyStruct {
let manny = "Hi"
let moe = "Hey"
let jack = "Howdy"
}
let paths = [\MyStruct.manny, \MyStruct.moe, \MyStruct.jack]
let s = MyStruct()
let target = "y"
let results = paths.map { s[keyPath:$0].localizedCaseInsensitiveContains(target) }
// [false, true, true]
Может, что-то вроде этого? stackoverflow.com/questions/24844681/…