ios - Swift:无法将类型 '[Any]' 的值转换为指定类型 'NSString'

标签 ios swift uicollectionview uisearchbar

一般:我有一个 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/

相关文章:

iphone - UIDeviceRGBColor 泄漏 - 如何修复?

ios - 无法将 UIButton Outlet 添加到 UIView

ios - 如何在 Swift 中基本实现委托(delegate)?

ios - swift:在 Collection View 中的标签中显示进度

ios - 如果在集合的两侧,UICollectionViewCell 在缩放时不会绘制阴影

html - UIActivityViewController 超链接

iOS在webview中加载Base 64编码数据

ios - 如何在 Objective-C 项目中遵循 Swift 库中制定的协议(protocol)

java - 快速获取修改后的Java UTF(使用java writeUTF()方法创建)的前两个字节的内容长度

objective-c - UICollectionViewCell 上的手势;如何处理结果?