2017-10-19 4 views
0

나는 UITableViewUISearchController을가집니다. UISearchBar.textNSPredicate에 따라 데이터 정렬 (allGames)을 필터링하려고합니다.NSPredicate에 따라 구조체 배열 필터링 SWIFT

내 코드는 다음과 같이 문자열의 배열을 필터링 : 여기

func updateSearchResults(for searchController: UISearchController) { 

    filteredGames.removeAll(keepingCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) 
    let array = (allGames).filtered(using: searchPredicate) 

    filteredGames = array as! [String] 

    self.tableView.reloadData() 
} 

내 배열을 필터링 할 수 있습니다. 하지만이 구조체를 만들면 :

struct Games { 

    var name: String? 
    var type: String? 
    var image: UIImage? 
} 

게임 이름과 유형에 따라 배열을 필터링하려면 어떻게해야합니까? 귀하의 도움에 미리 감사드립니다. 구조체가 단수형 Game에 지명 될 것으로 예상되는 방식에 의해 - - allGames 가정

+0

[Search Bar Swift 3 - 콜렉션에서 연산자를 사용할 수 없음] (https://stackoverflow.com/questions/41308007/search-bar-swift-3-cant-use-in- contains-operator-with-collection) - 구조체 배열에 NSPredicate를 사용할 수 없습니다. –

+0

참고 사항 [Swift - 구조체 배열을 사용하여 UISearchController 및 NSPredicate를 사용하여 검색] (https://stackoverflow.com/questions/32556328/swift-search-using-uisearchcontroller-and-nspredicate-with-an-array-of- structs) 또는 [구조체 검색] (https://stackoverflow.com/questions/34360226/search-for-struct-in-swift)을 참조하십시오. –

+0

오, 나는 많은 질문을 읽고 이러한 질문을 찾지 못했습니다! –

답변

2

배열 [Games]이다 내가보기 엔 typename를 선언

let searchText = searchController.searchBar.text! 
let fileredGames = allGames.filter { $0.name?.range(of: searchText, options: [.caseInsensitive]) != nil 
            || $0.type?.range(of: searchText, options: [.caseInsensitive]) != nil } 

도 고려 네이티브 스위프트 filter 기능을 사용하는 것이 좋습니다 구조체에서 비 선택적으로.

+0

잘 작동하는 것 같습니다. 내 배열 allGames 필터링 된 게임과 차이를 만들 이름. 내 구조체에서 초기화 된 변수를 만드는 것이 더 낫다는 것을 의미합니까? 'let name : String = ""'처럼? –

+0

아니요, 일반적인 오해가 있습니다. 많은 사람들은 이니셜 라이저없이 속성을 선택 사항이 아닌 (느낌표 또는 물음표 없음) 선언 할 수 없다는 것을 자습서에서 암시합니다. 클래스의 경우에는 맞지만 구조체 **에서는 ** 암시적인 memberwise 이니셜 라이저가 있기 때문에 ** 할 수 있습니다. 값이 변경되지 않는다면 상수'let name : String'으로 속성을 선언 할 수도 있습니다. – vadian