谓词 swift 中的可选值不起作用
Predicate on optional value in swift not working
我尝试预测可选值,它总是使应用程序崩溃并出现以下错误。
* Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key q_id.'
* First throw call stack:
虽然模型中有变量定义,但它是这样定义的
var q_id : Int!
如果我在 unwrap 中转换这个变量,它工作正常
var q_id = Int()
那么有没有其他方法可以断言可选值?
let Qid = dictData.objectForKey("q_id") as? String
let fQuesID : Int = Int(Qid!)!;
let predicate = NSPredicate(format: "SELF.q_id == %i",fQuesID)
let arrObj : NSArray = arrData.filteredArrayUsingPredicate(predicate) ;
//arrData.filter { predicate.evaluateWithObject([=13=]) }
if(arrObj.count > 0)
{
let objPostModel : ViewPostModel = arrObj.firstObject as! ViewPostModel;
objPostModel.isPollExpired = 1; // 1 Means Poll Expired!
self.tblViewPost?.reloadData();
}
它只发生在原始可选类型变量(int、float 等...)中
更新:
如果您将原始类型设置为非可选类型,那么它可以正常工作
我假设 dictData
是一个 NSDictionary
包含键 "q_id" 的 String
值,
arrData
是只包含 ViewPostModel
的 NSArray
。
而在 class ViewPostModel
中,q_id
是 Int?
.
类型的 属性
有了所有这些,您可以用更多 Swifty 方式编写代码:
if let
qId = dictData["q_id"] as? String,
fQuesID = Int(qId)
{
let arrObj = (arrData as! [ViewPostModel]).filter{[=10=].q_id == fQuesID}
if let objPostModel = arrObj.first {
objPostModel.isPollExpired = 1 // 1 Means Poll Expired!
self.tblViewPost?.reloadData()
}
} else {
print("invalid q_id in dictData")
}
(通过将 arrData
声明为 [ViewPostModel]
,您将无需使用危险的 as!
运算符。您可以使其他部分更 Swifty。 )
一般来说,如果您只使用 NSPredicate
来过滤数组,最好使用 Swift filter
方法和闭包。
我尝试预测可选值,它总是使应用程序崩溃并出现以下错误。
* Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ valueForUndefinedKey:]: this class is not key value coding-compliant for the key q_id.' * First throw call stack:
虽然模型中有变量定义,但它是这样定义的
var q_id : Int!
如果我在 unwrap 中转换这个变量,它工作正常
var q_id = Int()
那么有没有其他方法可以断言可选值?
let Qid = dictData.objectForKey("q_id") as? String
let fQuesID : Int = Int(Qid!)!;
let predicate = NSPredicate(format: "SELF.q_id == %i",fQuesID)
let arrObj : NSArray = arrData.filteredArrayUsingPredicate(predicate) ;
//arrData.filter { predicate.evaluateWithObject([=13=]) }
if(arrObj.count > 0)
{
let objPostModel : ViewPostModel = arrObj.firstObject as! ViewPostModel;
objPostModel.isPollExpired = 1; // 1 Means Poll Expired!
self.tblViewPost?.reloadData();
}
它只发生在原始可选类型变量(int、float 等...)中
更新: 如果您将原始类型设置为非可选类型,那么它可以正常工作
我假设 dictData
是一个 NSDictionary
包含键 "q_id" 的 String
值,
arrData
是只包含 ViewPostModel
的 NSArray
。
而在 class ViewPostModel
中,q_id
是 Int?
.
有了所有这些,您可以用更多 Swifty 方式编写代码:
if let
qId = dictData["q_id"] as? String,
fQuesID = Int(qId)
{
let arrObj = (arrData as! [ViewPostModel]).filter{[=10=].q_id == fQuesID}
if let objPostModel = arrObj.first {
objPostModel.isPollExpired = 1 // 1 Means Poll Expired!
self.tblViewPost?.reloadData()
}
} else {
print("invalid q_id in dictData")
}
(通过将 arrData
声明为 [ViewPostModel]
,您将无需使用危险的 as!
运算符。您可以使其他部分更 Swifty。 )
一般来说,如果您只使用 NSPredicate
来过滤数组,最好使用 Swift filter
方法和闭包。