我尝试对可选值进行谓词,并且它总是使应用程序崩溃并出现以下错误。
*由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[valueForUndefinedKey:]:此类不是密钥值q_id的编码兼容。 * 首先抛出调用堆栈:
虽然模型中有变量定义,但它是这样定义的
var q_id : Int!
如果我在展开时将此变量转换为正常工作
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($0) }
if(arrObj.count > 0)
{
let objPostModel : ViewPostModel = arrObj.firstObject as! ViewPostModel;
objPostModel.isPollExpired = 1; // 1 Means Poll Expired!
self.tblViewPost?.reloadData();
}
它只发生在原始的可选类型变量(int,float等)
中更新 如果你使原始类型unoptional然后它工作正常
答案 0 :(得分:3)
我认为dictData
是一个NSDictionary
,其中包含关键字“q_id”的String
值,
arrData
是NSArray
,仅包含ViewPostModel
。
在课程ViewPostModel
中,q_id
是Int?
类型的属性。
有了所有这些,你可以用更多的Swifty方式编写代码:
if let
qId = dictData["q_id"] as? String,
fQuesID = Int(qId)
{
let arrObj = (arrData as! [ViewPostModel]).filter{$0.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
方法和闭包。