[英]Swift: Cannot convert value of type '[Any]' to specified type 'NSString'
一般:我有一个集合视图应用程序与几个plist中的几个项目取决于用户选择的一个。 plist是一个包含多个数组的数组,每个数组中都有多个字符串。
问题:在使用搜索栏搜索我的集合(或plist)时,我在遵循教程时遇到此错误。
我知道这个搜索条形码是为了查找字符串而不是plist中另一个数组内的数组内的字符串。 所以我正在寻找帮助来修复我的错误和代码。
错误:
无法将'[Any]'类型的值转换为指定类型'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>
搜索栏需要搜索每个数组中的第一个字符串。 谢谢!
如果您只想搜索car
内部数组的第一个元素,则应使用flatMap
获取第一个元素。 您还应该立即将元素NSString
为NSString
,以避免必须在filter
内部进行转换。
filtered = car.flatMap({$0.first as? NSString})filter({ (text) -> Bool in...
但是,您对数据结构的选择相当奇怪。 你为什么要将car
声明为[[Any]]
,当它只包含String
时,内部数组看起来应该是字典而不是数组? 我建议您将car
声明为[[String:String]]
并相应地修改.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
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.