[英]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.