40

NSDictionaryAPI サーバーからの JSON 応答から取り込まれた があります。このディクショナリのキーの値がNull

指定された値を取得し、それをテーブル セルの詳細テキストにドロップして表示しようとしています。

問題は、値を文字列に強制しようとするとNSStringクラッシュすることです。これは、文字列に強制しようとしていることが原因だと思いNullます。

これを行う正しい方法は何ですか?

私がやりたいことは次のようなものです:

cell.detailTextLabel.text = sensor.objectForKey( "latestValue" ) as NSString

ディクショナリの例を次に示します。

Printing description of sensor:
{
    "created_at" = "2012-10-10T22:19:50.501-07:00";
    desc = "<null>";
    id = 2;
    "latest_value" = "<null>";
    name = "AC Vent Temp";
    "sensor_type" = temp;
    slug = "ac-vent-temp";
    "updated_at" = "2013-11-17T15:34:27.495-07:00";
}

これらすべてを条件付きでラップする必要がある場合は、それで問題ありません。その条件が何であるかを理解することができませんでした。Objective-C の世界に戻って比較し[NSNull null]ますが、Swift では機能していないようです。

4

6 に答える 6

88

as?オプションの値を返す演算子を使用できます(nilダウンキャストが失敗した場合)

if let latestValue = sensor["latestValue"] as? String {
    cell.detailTextLabel.text = latestValue
}

この例を迅速なアプリケーションでテストしました

let x: AnyObject = NSNull()
if let y = x as? String {
    println("I should never be printed: \(y)")
} else {
    println("Yay")
}

正しく印刷されます"Yay"が、

let x: AnyObject = "hello!"
if let y = x as? String {
    println(y)
} else {
    println("I should never be printed")
}

期待どおりに印刷"hello!"されます。

于 2014-06-03T23:29:50.863 に答える
37

isnull の存在を確認するために使用することもできます。

if sensor["latestValue"] is NSNull {
    // do something with null JSON value here
}
于 2016-06-02T07:11:07.647 に答える
9

NSNull は他のクラスと同様です。したがって、isまたはを使用asして AnyObject 参照をテストできます。

したがって、ここで私のアプリの 1 つに、すべてのエントリが Card または NSNull のいずれかである NSArray があります (NSArray に nil を入れることはできないため)。NSArray を配列としてフェッチし、取得するオブジェクトの種類を切り替えて循環します。

for card:AnyObject in arr {
    switch card { // how to test for different possible types
    case let card as NSNull:
        // do one thing
    case let card as Card:
        // do a different thing
    default:
        fatalError("unexpected object in card array") // should never happen!
    }
}

これはあなたのシナリオと同じではありませんが、Swift に変換された動作中のアプリからのものであり、完全な一般的な手法を示しています。

于 2014-06-19T16:28:33.593 に答える
8

今のところ私の解決策:

func isNull(someObject: AnyObject?) -> Bool {
    guard let someObject = someObject else {
        return true
    }

    return (someObject is NSNull)
}

テストは今のところ順調に見えます...

テストは今のところ良さそうです

于 2016-06-17T06:48:10.350 に答える
3

私は非常によく似た問題を抱えていて、元の NSDictionary 値の正しい型にキャストすることで解決しました。サービスがこのような混合タイプの JSON オブジェクトを返す場合

{"id":2, "name":"AC Vent Temp", ...}

そのような値を取得する必要があります。

var id:int = sensor.valueForKey("id") as Int;
var name:String? = sensor.valueForKey("name") as String;

これで私の問題は解決しました。迅速な閉鎖内で BAD_INSTRUCTIONを参照してください

于 2014-06-04T19:49:34.640 に答える