从 '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
,等等)。
在 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
,等等)。