对swift中的可选值谓词不起作用

时间:2016-07-15 06:03:04

标签: ios swift nsarray nspredicate

我尝试对可选值进行谓词,并且它总是使应用程序崩溃并出现以下错误。

  

*由于未捕获的异常'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然后它工作正常

1 个答案:

答案 0 :(得分:3)

我认为dictData是一个NSDictionary,其中包含关键字“q_id”的String值,   arrDataNSArray,仅包含ViewPostModel。 在课程ViewPostModel中,q_idInt?类型的属性。

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