从 'String' 转换为无关类型 'LocationModel' 总是失败警告

Cast from 'String' to unrelated type 'LocationModel' always fails warning

在 NSArray 中,我需要过滤所有包含 searchKey 的元素(例如 39013)。现在,我可以打印并查看 Xcode 上的值,但我希望它们出现在我的设备上。我有两个数组。 第一个是:

var feedItems: NSArray = NSArray()

过滤后的是

var filteredData:[String] = [] 

我打印过滤后的数据,一切都如我所愿。这是我在打印行时在 viewController 上犯了一个错误的问题。

if resultSearchController.isActive {

     let item: LocationModel = feedItems[indexPath.row] as! LocationModel 

我需要将 .. = feedItems 更改为 .. = filteredData 但是当我更改时,由于 filteredData 是一个字符串数组(不是 NSarray),我得到一个错误:

Cast from 'String' to unrelated type 'LocationModel' always fails

你能帮我解决最后一个问题吗?非常感谢!!

代码如下:

这是对象:

import UIKit
class LocationModel: NSObject {
    //properties
     var DesenNo: String?
     var Dolar: String?
     var Zemin: String?
     var En: String?
     var Euro: String?
     var Renk: String?
}

在Swift 3+中尽量避免(NS)像NSArray这样的东西。如果可用,更喜欢 Swift 版本。

您声明:

var filteredData:[String] = [] 

所以 filteredData 将是 String 的数组,只有 String 个对象。

那你就做

let item: LocationModel = filteredData[indexPath.row] as! LocationModel 

但是您之前说过 filteredData 将是一个 String 对象数组。所以 filteredData[indexPath.row] 应该是一个 String 对象。但是您正试图将其强制转换为 LocationModel 对象。编译器说:这没有发生,我无法将 String 对象转换为 LocationModel 对象。

对于NSArray,里面的对象是Any类型。如果您将 filteredData 声明为 NSArray 但放入 LocationModel 个对象:

let item: LocationModel = filteredDataAsNSArray[indexPath.row] as! LocationModel 

毫无疑问,那会崩溃。

还有一些问题,我想你想要过滤数据是 LocationModel 个对象

这样做:

var filteredData:[LocationModel] = []()
var feedItems:[LocationModel] = []()

过滤:您想过滤 LocationModel 的每个值,因此谓词格式应为:

(SELF.DesenNo CONTAINS[c] %@) OR (SELF.Dolar CONTAINS[c] %@) OR (SELF.Zemin CONTAINS[c] %@) OR (SELF.En CONTAINS[c] %@) OR (SELF.Euro CONTAINS[c] %@) OR (SELF.Renk CONTAINS[c] %@)

您还可以在伪代码中使用 Swift 过滤器(未测试):

let textToSearch = searchController.searchBar.text
filteredData = feedItems.filter({[=15=].DesenNo.lowercased().contains(textToSearch.lowercased()) || [=15=].DesenNo.lowercased().contains(textToSearch.lowercased()) || ...})

同样在 tableView(_ tableView:, cellForRowAt:) 中,您一次又一次地做同样的事情,应该将其分解并为了更清楚地放入 MyTableCell 代码中。 这样你可以做类似cell.updateWith(item:item)的事情,这样会更清楚。

编辑: 最后建议:请以小写开头重命名您的 var(DesenNo => desenNo,等等)。