Как отфильтровать массив, содержащий строку и массив объектов структуры, в котором есть строковый параметр? - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть массив

var friendsListGroupedFiltered = [Object]()

этой структуры

struct Object {
    var letters : String
    var sectionObjects : [Friend]
}

, который содержит массив объектов другой структуры

struct Friend {
    let name: String
    let image: UIImage?
    let likes: Int
    let isLiked: Bool
}
extension Friend: Equatable {
    static func == (lhs: Friend, rhs: Friend) -> Bool {
        return lhs.name == rhs.name
    }
}

И если быть точнымЯ хочу сделать функцию фильтра для панели поиска.Я попытался вот так

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    guard !searchText.isEmpty else {
        friendsListGroupedFiltered = friendsListGrouped
        tableView.reloadData()
        return
    }
    friendsListGroupedFiltered = friendsListGroupedFiltered.filter {
        $0.sectionObjects.filter {
            $0.name.range (of: searchText, options: .caseInsensitive) != nil
        }
    }
    tableView.reloadData()
}

и получил ошибку

Невозможно преобразовать значение типа '[Friend]' в закрывающий тип результата 'Bool'

массив friendsListGroupedFiltered выглядит примерно так

[Object(
    letters: "А",
    sectionObjects: [
        Friend(name: "Августин", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false),
        Friend(name: "Акакий", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false),
        Friend(name: "Алёша", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false),
        Friend(name: "Армэн", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false)
    ]
),
Object(
    letters: "В",
    sectionObjects: [
        Friend(name: "Вася", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false)
    ]
),
Object(
    letters: "К",
    sectionObjects: [
        Friend(name: "Коловрат", image: Optional(<UIImage: 0x600000d3ab50>, {200, 200}), likes: 20, isLiked: false)
    ]
)

и т. Д.
Как отсортировать массив по «имени», который содержится в другом массиве объектов другой структуры?

1 Ответ

0 голосов
/ 25 ноября 2018

Результатом filter является массив отфильтрованных объектов ([Friend]), но результатом закрытия фильтрации является Bool.

Вот что говорит вам сообщение об ошибке.

Вы можете проверить, не является ли отфильтрованный массив пустым, но лучше: contains

friendsListGroupedFiltered = friendsListGrouped.filter {
    $0.sectionObjects.contains {
        $0.name.range (of: searchText, options: .caseInsensitive) != nil
    }
}
...