谓词 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 是只包含 ViewPostModelNSArray。 而在 class ViewPostModel 中,q_idInt?.

类型的 属性

有了所有这些,您可以用更多 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 方法和闭包。