如何搜索结构(Swift)

时间:2017-07-02 20:44:54

标签: ios swift uitableview struct uisearchbar

我正在改变我的2个阵列......

var title = ["Title 1", "Title 2", "Title 3"]
var artist = ["Artist 1", "Artist 2", "Artist 3"]

...到结构

struct Song {
    var title: String
    var artist: String
}

var songs: [Song] = [
    Song(title: "Title 1", artist "Artist 1"),
    Song(title: "Title 2", artist "Artist 2"),
    Song(title: "Title 3", artist "Artist 3"),
]

我设置了我的UITableView,以便该单元格的标题等于songs[indexPath.row].title,并且该单元格的副标题等于songs[indexPath.row].artist

但是,我希望能够使用UITableView搜索UISearchBar。每当我只有变量而不是结构时,它工作正常。但是,现在我发现错误

var filteredTitles:[String] = []
var searchActive : Bool = false

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    filteredTitles = title.filter //the error ({ (text) -> Bool in
        let tmp: NSString = text as NSString
        let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
        return range.location != NSNotFound
    })
        if(filteredTitles.count == 0){
        searchActive = false;
    } else {
        searchActive = true;
    }
    self.myTableView.reloadData()
}

如您所见,在filteredTitles = title.filter行上,它调用我的旧变量title。我该怎么替换这一行,以便搜索结构的标题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您需要将filteredTitles更改为Song的数组(并将其重命名为filteredSongs

然后将通话更新为filter,以便将text替换为song,并访问title的{​​{1}}属性。

并且无需将标题转换为song

这是您的代码所需的更改:

NSString

这假定var filteredSongs = [Song]() var searchActive = false func searchBar(searchText: String) { filteredSongs = songs.filter { (song) -> Bool in return song.title.range(of: searchText, options: [ .caseInsensitive ]) != nil } searchActive = !filteredSongs.isEmpty self.myTableView.reloadData() } 是您的歌曲数组。

请注意,还有很多其他清理工作。

您可能需要更新表格视图数据源方法,以处理songs数组filteredSongs而不是Song数组。