1

既存のswift2.3をswift3に変換しようとしています。次のコードで、intValue エラーで Ambiguous use が発生しました。

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

intValueタイプ のオブジェクトを呼び出そうとしていますAnyObjectNSNumberエラーが示すように、 と の両方にプロパティNSStringがあるため、これはあいまいすぎます。Xcode は、 と の両方が傘下にあるため、どちらを使用すればintValueよいかわかりません。Xcode は混乱しているため、オブジェクトの型をより具体的にする必要があります。次のようなことを試してください:intValueNSNumberNSStringAnyObject

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 に答える