1

我一直在尝试将现有的 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") }
}

任何帮助,将不胜感激。

谢谢。

4

1 回答 1

3

您正在尝试调用intValuetype 的对象AnyObject。正如错误所述,这太模棱两可了,因为两者NSNumber都有NSString属性intValue。Xcode 不知道该intValue使用哪个,因为两者都NSNumber属于NSString保护范围AnyObject。由于 Xcode 很混乱,您需要更具体地了解您的对象是什么类型。尝试这样的事情:

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

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

注意 2:在使用!. 如果您使用的字典返回 nil,您的程序将崩溃。相反,我会根据您的用例使用if letor语句安全地打开它们。guard像这样的东西可能会更好一些:

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

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

于 2016-12-24T02:29:35.400 回答