0

これは私が辞書でやろうとしていることです:

    if let deliveries = dictionary["deliveries"] as? NSDictionary {

        var castedDeliveries = [Double: Double]()

        for delivery in deliveries {

            if let value = delivery.value as? Double {
                castedDeliveries[Double(delivery.key as! NSNumber)] = value //Could not cast value of type 'NSTaggedPointerString' (0x1a1e3af20) to 'NSNumber' (0x1a1e458b0).
            }
        }
        settings!.deliveries = castedDeliveries
    }

これは、サーバーからの JSON 応答の一部として、キャストしようとしているものです。

deliveries =            {
    2 = 0;
    5 = "2.59";
    7 = "3.59";
};

コメント行にエラーがあるため、機能しません。

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

4

3 に答える 3

0

キャストとは、ある型から別の型へのデータ変換を意味するものではありません。
あなたの辞書はIntegerキーとString値で構成されているようです。
他のものに変換したい場合は、マップ機能を使用できます。

let converted = deliveries.map{[Double($0) : Double($1)]}

しかし、注意してください。
ここでは、辞書を反復処理し ($0 には辞書キーがあり、$1 には値があります) Double、キー値として初期化された a と新しい値として a として初期化されDoubleた新しい辞書を作成します。古い辞書の値。最後の変換は失敗する可能性があるため、返されるデータはオプションです。

于 2016-02-08T13:19:16.720 に答える
0

コメントで指摘したように、これはキャストではありません。データ変換が必要です。特にこの場合、失敗する可能性があるため、明示的に行う必要があります。

エラーを見ると、本当に[String:String]ここの辞書を持っていると思います(NSDictionary形式で)。これは、JSON が適切にエンコードされていないことを示唆していますが、これが人生です。それが次のようになっていると仮定しdictionaryます。

let dictionary: NSDictionary = ["deliveries": ["2":"0", "5": "2.59", "7": "3.59"]]

[Double:Double]次のように変換します。

if let jsonDeliveries = dictionary["deliveries"] as? [String:String] {
    var deliveries: [Double: Double] = [:]
    for (key, value) in jsonDeliveries {
        if let keyDouble = Double(key),
            valueDouble = Double(value) {
                deliveries[keyDouble] = valueDouble
        }
    }
    // Use deliveries
}

これは、Double に変換できない値を黙って無視します。エラーを生成したい場合は、guard letではなく を使用してif letください。

于 2016-02-08T13:58:49.187 に答える