1. ホーム
  2. ios

タイプ 'NSTaggedPointerString' の値を 'NSNumber' にキャストできませんでした。

2023-09-21 14:26:55

質問

このようなSwiftの構造体を持っています。

struct Usage {
    var totalData: Double
    var remainingTotalData: Double

    init(jsonData: NSData) {
        var jsonDict = [String: AnyObject]()

        do {
            jsonDict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! [String: AnyObject]
        } catch {
            print("Error occurred parsing data: \(error)")
        }

        totalData = jsonDict["totalfup"] as! Double
        remainingTotalData = jsonDict["totalrem"] as! Double
    }
}

APIから、以下のようなJSONのレスポンスが返ってきます。これは jsonDict 変数の出力です。

[
    "totalfup": 96.340899, 
    "totalrem": 3548710948
]

の値を代入しようとすると totalfup というプロパティに totalData を追加すると、このエラーが発生します。

タイプ 'NSTaggedPointerString' の値を 'NSNumber' にキャストできませんでした。

誰か理由を知っていますか?私は、プロパティの種類を float に変更し、構造体全体をクラスに変更してみましたが、まだ問題が発生しています。

どのように解決するのですか?

エラーの原因は jsonDict["totalfup"] が文字列であること ( NSTaggedPointerString のサブクラスで NSString のサブクラス)なので、StringをDoubleに変換する必要があります。

強制アンラップする前に、必ず例外をキャッチし、型をチェックしてください!

totalData = (jsonDict["totalfup"] as! NSString).doubleValue

について 安全性 を使用すると if let :

// check dict["totalfup"] is a String?
if let totalfup = (dict["totalfup"] as? NSString)?.doubleValue {
  // totalfup is a Double here 
}
else {
  // dict["totalfup"] isn't a String
  // you can try to 'as? Double' here
}