无法将类型 'Swift._ContiguousArrayStorage<AppName.JobsNearBy>' (0x113b1a200) 的值转换为 'AppName.JobsNearBy' (0x10e6e7e60)
Could not cast value of type 'Swift._ContiguousArrayStorage<AppName.JobsNearBy>' (0x113b1a200) to 'AppName.JobsNearBy' (0x10e6e7e60)
我正在尝试从 Web 获取数据并尝试使用 AZTableView 库进行分页。我正面临上述错误。这是我的代码
我的模态class
class JobsNearBy: NSObject {
var jobId: Int?
var title: String?
var companyName: String? }
获取数据代码
我第一次从网上获取 10 行,将它们放入对象并附加到数组和 return.
func jobsNearByFetch(pageNumber: Int, success:@escaping (_ status:Bool, _ jobsNearByArray:Any) -> (), failure:@escaping (_ message: Error) -> ()) {
let headers: HTTPHeaders = ["Accept": "application/json",
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhb"]
let url = "http://thedemo.net/demo/stdinaus/api/jobs-near-me?page=\(pageNumber)&latitude=27.6947033&longitude=85.3310636"
Alamofire.request(url, headers: headers).responseJSON { response in
guard let jobsResponse = response.result.value as? [String:Any] else{
print("Error: \(String(describing: response.result.error))")
failure((response.result.error! as Error))
return
}
// print("response: \(jobsResponse)")
let jobsNearByObj:JobsNearBy = JobsNearBy()
var jobsNearByArray:Array = [JobsNearBy]()
let dict = jobsResponse as NSDictionary
let status = dict["status"] as? Int
let meta = dict["meta"] as! NSDictionary
let lastPage = meta["last_page"] as? Int
let dataArray = dict["data"] as! NSArray
for dataDict in dataArray{
let dataCompanyName = dataDict as! NSDictionary
let jobId = dataDict as! NSDictionary
let title = dataDict as! NSDictionary
if let companyName = dataCompanyName["company_name"],
let jobId = jobId["jobId"],
let title = title["title"]{
jobsNearByObj.companyName = companyName as? String
jobsNearByObj.jobId = jobId as? Int
jobsNearByObj.title = title as? String
jobsNearByArray.append(jobsNearByObj)
}
}
success(true, jobsNearByArray)
}
}
AZTableViewController 中的代码
override func fetchData() {
super.fetchData()
if Util.isConnectedToInternet(){
self.showLoading(view: self.view, text: "Loading..")
APIHandler.sharedInstance.jobsNearByFetch(pageNumber: 1, success: { (status, jobsArray) in
self.stopLoading(fromView: self.view)
self.arrayOfJobs.removeAll()
self.arrayOfJobs.append(jobsArray as! JobsNearBy)
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: true)
}) { (failure) in
self.stopLoading(fromView: self.view)
print("Failure")
}
}else{
Util.showAlert(title:"Oops", message:"No internet connection..", view:self)
}
}
override func fetchNextData() {
super.fetchNextData()
if Util.isConnectedToInternet(){
self.showLoading(view: self.view, text: "Loading..")
APIHandler.sharedInstance.jobsNearByFetch(pageNumber: 2, success: { (status, jobsArray) in
self.stopLoading(fromView: self.view)
self.arrayOfJobs.append(jobsArray as! JobsNearBy)
if self.arrayOfJobs.count < 10{
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: true)
}else{
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: false)
}
}) { (failure) in
self.stopLoading(fromView: self.view)
print("Failure")
}
}else{
Util.showAlert(title:"Oops", message:"No internet connection..", view:self)
}
}
我想我在附加行上犯了错误但无法解决这个问题。请有人帮助我解决上述错误。
您 jobsNearByFetch
return 的完成处理程序是 JobsNearBy
的数组,您将其放入 jobsArray
然后,你有一个从 jobsArray
到 JobsNearBy
的强制转换,但它是一个数组,而不是对象的单个实例,所以向下转换失败并且因为它是强制向下转换你的应用程序崩溃。
你 可以 使用 as! [JobsNearBy]
修复它,但最好更改完成闭包的签名以表明它 returns [JobsNearBy]
而不是 Any
;那么你不需要向下转换任何东西:
如果可以确定实际类型,则不应使用 Any
。此外,如果可以避免,在 Swift 中工作时不应使用 NSDictionary
。此外,尽可能避免强制向下转型和展开。
从风格上讲,布尔值 success
参数和一个单独的失败闭包也有点奇怪;你通常会有一个闭包 returns 一个可选的 Error
- 如果错误是 nil
那么操作成功。
我会:
func jobsNearByFetch(pageNumber: Int, completion:@escaping ( _ jobsNearByArray:[JobsNearBy]?, error:Error?) -> ()) {
这样您就可以使用单个尾随闭包。
您还需要查看 jobsNearByFetch
,因为有一些 return 路径不调用闭包。
最后,你应该看看 Codeble
协议,因为它可以完全消除 JSON 解析代码。
我正在尝试从 Web 获取数据并尝试使用 AZTableView 库进行分页。我正面临上述错误。这是我的代码
我的模态class
class JobsNearBy: NSObject {
var jobId: Int?
var title: String?
var companyName: String? }
获取数据代码 我第一次从网上获取 10 行,将它们放入对象并附加到数组和 return.
func jobsNearByFetch(pageNumber: Int, success:@escaping (_ status:Bool, _ jobsNearByArray:Any) -> (), failure:@escaping (_ message: Error) -> ()) {
let headers: HTTPHeaders = ["Accept": "application/json",
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhb"]
let url = "http://thedemo.net/demo/stdinaus/api/jobs-near-me?page=\(pageNumber)&latitude=27.6947033&longitude=85.3310636"
Alamofire.request(url, headers: headers).responseJSON { response in
guard let jobsResponse = response.result.value as? [String:Any] else{
print("Error: \(String(describing: response.result.error))")
failure((response.result.error! as Error))
return
}
// print("response: \(jobsResponse)")
let jobsNearByObj:JobsNearBy = JobsNearBy()
var jobsNearByArray:Array = [JobsNearBy]()
let dict = jobsResponse as NSDictionary
let status = dict["status"] as? Int
let meta = dict["meta"] as! NSDictionary
let lastPage = meta["last_page"] as? Int
let dataArray = dict["data"] as! NSArray
for dataDict in dataArray{
let dataCompanyName = dataDict as! NSDictionary
let jobId = dataDict as! NSDictionary
let title = dataDict as! NSDictionary
if let companyName = dataCompanyName["company_name"],
let jobId = jobId["jobId"],
let title = title["title"]{
jobsNearByObj.companyName = companyName as? String
jobsNearByObj.jobId = jobId as? Int
jobsNearByObj.title = title as? String
jobsNearByArray.append(jobsNearByObj)
}
}
success(true, jobsNearByArray)
}
}
AZTableViewController 中的代码
override func fetchData() {
super.fetchData()
if Util.isConnectedToInternet(){
self.showLoading(view: self.view, text: "Loading..")
APIHandler.sharedInstance.jobsNearByFetch(pageNumber: 1, success: { (status, jobsArray) in
self.stopLoading(fromView: self.view)
self.arrayOfJobs.removeAll()
self.arrayOfJobs.append(jobsArray as! JobsNearBy)
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: true)
}) { (failure) in
self.stopLoading(fromView: self.view)
print("Failure")
}
}else{
Util.showAlert(title:"Oops", message:"No internet connection..", view:self)
}
}
override func fetchNextData() {
super.fetchNextData()
if Util.isConnectedToInternet(){
self.showLoading(view: self.view, text: "Loading..")
APIHandler.sharedInstance.jobsNearByFetch(pageNumber: 2, success: { (status, jobsArray) in
self.stopLoading(fromView: self.view)
self.arrayOfJobs.append(jobsArray as! JobsNearBy)
if self.arrayOfJobs.count < 10{
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: true)
}else{
self.didfetchData(resultCount: self.arrayOfJobs.count, haveMoreData: false)
}
}) { (failure) in
self.stopLoading(fromView: self.view)
print("Failure")
}
}else{
Util.showAlert(title:"Oops", message:"No internet connection..", view:self)
}
}
我想我在附加行上犯了错误但无法解决这个问题。请有人帮助我解决上述错误。
您 jobsNearByFetch
return 的完成处理程序是 JobsNearBy
的数组,您将其放入 jobsArray
然后,你有一个从 jobsArray
到 JobsNearBy
的强制转换,但它是一个数组,而不是对象的单个实例,所以向下转换失败并且因为它是强制向下转换你的应用程序崩溃。
你 可以 使用 as! [JobsNearBy]
修复它,但最好更改完成闭包的签名以表明它 returns [JobsNearBy]
而不是 Any
;那么你不需要向下转换任何东西:
如果可以确定实际类型,则不应使用 Any
。此外,如果可以避免,在 Swift 中工作时不应使用 NSDictionary
。此外,尽可能避免强制向下转型和展开。
从风格上讲,布尔值 success
参数和一个单独的失败闭包也有点奇怪;你通常会有一个闭包 returns 一个可选的 Error
- 如果错误是 nil
那么操作成功。
我会:
func jobsNearByFetch(pageNumber: Int, completion:@escaping ( _ jobsNearByArray:[JobsNearBy]?, error:Error?) -> ()) {
这样您就可以使用单个尾随闭包。
您还需要查看 jobsNearByFetch
,因为有一些 return 路径不调用闭包。
最后,你应该看看 Codeble
协议,因为它可以完全消除 JSON 解析代码。