一般:我有一个 Collection View 应用程序,其中包含来自多个 plist 的多个项目,具体取决于用户选择的项目。 plist 是一个包含多个数组的数组,每个数组中包含多个字符串。
问题:在执行搜索栏以搜索我的收藏(或 plist)时,我在遵循教程时遇到此错误。
我知道这个搜索条码是为了寻找一个字符串,而不是 plist 中另一个数组中的数组中的字符串。所以我正在寻求帮助来修复我的错误和代码。
错误:
Cannot convert value of type '[Any]' to specified type 'NSString'
这是导致错误的代码。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
filtered = car.filter({ (text) -> Bool in
let tmp: NSString = text // <-- ** Error is here **
let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range.location != NSNotFound
})
if(filtered.count == 0){
searchActive = false;
} else {
searchActive = true;
}
self.finalCollectView.reloadData()
}
SearchBar 的其余代码
func createSearchBar() {
let mySearchBar = UISearchBar()
mySearchBar.showsCancelButton = false
mySearchBar.placeholder = "Search"
mySearchBar.delegate = self
mySearchBar.alpha = 1
mySearchBar.tintColor = UIColor.black
mySearchBar.searchFieldBackgroundPositionAdjustment = UIOffset(horizontal: 5, vertical: 0)
self.navigationItem.titleView = mySearchBar
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchActive = true;
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchActive = false;
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
}
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchActive = false;
}
plist 代码
var filtered = [[Any]]()
var searchActive: Bool = false
var car = [[Any]]()
@IBOutlet weak var finalCollectView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
self.finalCollectView.delegate = self
self.finalCollectView.dataSource = self
readList(titlePlist: "car")
}
func readList(titlePlist: String) {
let url = Bundle.main.url(forResource: titlePlist, withExtension: "plist")!
do {
let data = try Data(contentsOf:url)
let sections = try PropertyListSerialization.propertyList(from: data, format: nil) as! [[Any]]
car = sections
} catch {
print("This error must never occur: Reading plist", error)
}
plist 的样子
<plist>
<array>
<array>
<string>Name1</string>
<string>Description</string>
</array>
<array>
<string>Name2</string>
<string>Description</string>
</array>
<array>
<string>Name3</string>
<string>Description</string>
</array>
</array>
</plist>
搜索栏需要搜索每个数组中的第一个字符串。谢谢!
最佳答案
在你的func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
中,将过滤修改为:
filtered = car.filter({ (anArray) -> Bool in
guard let firstString = (anArray.first as? String) else{
return false
}
let tmp: NSString = firstString as NSString
let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive)
return range.location != NSNotFound
})
关于ios - Swift:无法将类型 '[Any]' 的值转换为指定类型 'NSString',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47318842/