[英]Predicate on optional value in swift not working
我试图断言可选值,它总是崩溃应用程序与以下错误。
*由于未捕获的异常'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然后它工作正常
我假设dictData
是包含键“q_id”的String
值的NSDictionary
, arrData
是一个仅包含ViewPostModel
的NSArray
。 在ViewPostModel
类中, q_id
是Int?
类型的属性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
方法和闭包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.