繁体   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