簡體   English   中英

Swift:無法將'[Any]'類型的值轉換為指定類型'NSString'

[英]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獲取第一個元素。 您還應該立即將元素NSStringNSString ,以避免必須在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM