繁体   English   中英

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

[英]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值的NSDictionaryarrData是一个仅包含ViewPostModelNSArray ViewPostModel类中, q_idInt?类型的属性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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM