不明确使用intValue Swift3

时间:2016-11-08 13:37:27

标签: migration swift3 swift2.3

我一直在尝试将现有的swift2.3转换为swift3。我在以下代码中获得了 对intValue错误 的不明确使用。

jobPackageVersion.intJobPackageId =(JobPackageVersionDictionary [“intJobPackageId”]!as AnyObject).intValue as NSNumber

这是完整的代码

if let url = Bundle.main.url(forResource: "tblJobPackageVersion", withExtension: "csv") {
  do {
    let strData = try String(contentsOf: url)
    let csv = CSwiftV(String: strData)

    if csv.keyedRows != nil {
      for dictionary in csv.keyedRows! {  // [Dictionary<String, String>]
        let JobPackageVersionDictionary = dictionary as NSDictionary  // Cast to NSDictionary
        let JobPackageVersionEntity = NSEntityDescription.entity(forEntityName: "JobPackageVersion", in: context)
        let jobPackageVersion = JobPackageVersion(entity: JobPackageVersionEntity!, insertInto: context)

        // Set object attributes
        jobPackageVersion.intJobPackageId = (JobPackageVersionDictionary["intJobPackageId"]! as AnyObject).intValue as NSNumber
        jobPackageVersion.intJobPackageVersionId = (JobPackageVersionDictionary["intJobPackageVersionId"]! as AnyObject).intValue as NSNumber 
        jobPackageVersion.intStatus = (JobPackageVersionDictionary["intStatus"]! as AnyObject).intValue as NSNumber
        jobPackageVersion.intVersion = (JobPackageVersionDictionary["intVersion"]! as AnyObject).intValue as NSNumber

        do { // Save object to database and clean up memory
          try context.save()
          context.refresh(jobPackageVersion, mergeChanges: false)
        } catch let error as NSError { Logger.sharedInstance.logMessage("\(#function) JobPackageVersion Saving Error: \(error.userInfo)") }
      } // for-loop

      Logger.sharedInstance.logMessage("\(#function): Loaded \(csv.keyedRows!.count) tblJobPackageVersion records.")
    } else { Logger.sharedInstance.logMessage("\(#function) CSV Parser Warning: no CSV data was parsed in tblJobPackageVersion.csv!") }
  } catch { Logger.sharedInstance.logMessage("\(#function) Error reading contents of tblJobPackageVersion.csv.") }
} else { Logger.sharedInstance.logMessage("\(#function) Error locating URL for resource tblJobPackageVersion.csv") }
}

任何帮助都将不胜感激。

感谢。

1 个答案:

答案 0 :(得分:3)

您正尝试在intValue类型的对象上调用AnyObject。正如错误所述,这太模糊了,因为NSNumberNSString都有intValue属性。 Xcode不知道要使用哪个intValue,因为NSNumberNSString都属于AnyObject保护伞。由于Xcode很混乱,您需要更具体地说明对象的类型。尝试这样的事情:

jobPackageVersion.intJobPackageId = (JobPackageVersionDictionary["intJobPackageId"]! as NSNumber).intValue

注1:您可能会在调用intValue的其他对象时遇到相同的错误,但您可以相应地修复它们。

注2:请务必使用!强行展开对象。如果你正在使用的字典返回nil你的程序将崩溃。相反,我会根据您的使用情况使用if letguard语句安全地解开它们。这样的事情可能会好一点:

guard let intJobPackageId = JobPackageVersionDictionary["intJobPackageId"] as? NSNumber,
      let intJobPackageVersionId = JobPackageVersionDictionary["intJobPackageVersionId"] as? NSNumber,
      let intStatus = JobPackageVersionDictionary["intStatus"] as? NSNumber,
      let intVersion = JobPackageVersionDictionary["intVersion"] as? NSNumber
else {
    print("one of the dictionary values is nil")
    return
}

jobPackageVersion.intJobPackageId = intJobPackageId.intValue
jobPackageVersion.intJobPackageVersionId = intJobPackageVersionId.intValue
jobPackageVersion.intStatus = intStatus.intValue
jobPackageVersion.intVersion = intVersion.intValue

这可能不是您想要的,但它应该让您了解如何安全地展开您的对象,以便您的应用程序不会崩溃。你可以玩它并决定什么是最适合你的。