2016-10-24 1 views
1

Beginnend mit swift3 habe ich Probleme, zuverlässig zu erkennen nil/NSNull. In diesem Ausschnitt hier, anstelle von nil, bekomme ich einen Optional(_SwiftValue) Wert, den ich nicht erkennen kann.Wie nach nil/NSNull/optional zu prüfen, wenn Optional (_SwiftValue) beteiligt ist

Ich habe checking classForCoder ohne Glück versucht.

In anderen Ländern gibt es talk about id-as-Any causing this kind of problem

func testVotingMachine() { 
    let vote: String? = nil // Can be a string or nil 
    //let vote: String? = "president" // Can be a string or nil 
    var dict = [String: AnyObject?]() 
    dict["vote"] = vote as AnyObject? 
    let obj: AnyObject? = dict as AnyObject? 

    guard let dict2 = obj as? Dictionary<String, AnyObject?> else { 
     fatalError() 
    } 

    let value = dict2["vote"] as AnyObject? 
    let didVote = notNil(objectOrNil: value) 
    XCTAssertFalse(didVote) // BOOM! notNil() fails to detect nil 
} 

func notNil(objectOrNil: AnyObject?) -> Bool { 
    guard let object: AnyObject = objectOrNil else { 
     return false 
    } 
    if object is NSNull { 
     return false 
    } 
    //if object.classForCoder == NSNull.classForCoder() { 
    // return false 
    //} 
    // TODO: how to check for? Optional(_SwiftValue) 
    print("class for coder: \(object.classForCoder)") 
    return true 
} 

ich brauche, um meine Daten zu sanieren, bevor es zu JSONSerialization.data() vorbei. So muss ich erkennen Optional(_SwiftValue)

+0

wie man sieht das erwartete Ergebnis, wenn man auf 'dict' eine kleine Änderung vornehmen:' var dict = [Zeichenfolge: ANYOBJECT] '. – rmaddy

+0

Dies ist der kleinste Ausschnitt, den ich machen kann, der einen 'Optional (_SwiftValue)' in ein Wörterbuch einfügt. Es ist hässlich. Ist es ein interner Typ, der den Entwicklern nicht zugänglich sein soll? Oder ist es etwas, mit dem sich schnelle Entwickler beschäftigen müssen? Irgendwelche Ideen, wie man den 'Optional (_SwiftValue)' erkennt. – neoneye

Antwort

2

Ein ist eine Abkürzung für Optional<String>. Wenn es Null ist, wird es tatsächlich als Optional<String>.none dargestellt, was sich als AnyObject qualifiziert, so dass Ihr Test nicht funktioniert hat.

Sie können es wie folgt beheben:

func notNil(objectOrNil: AnyObject?) -> Bool { 
    guard let object: AnyObject = objectOrNil, 
     object as! _OptionalNilComparisonType != AnyObject?.none else { 
     return false 
    } 
    if object is NSNull { 
     return false 
    } 
    //if object.classForCoder == NSNull.classForCoder() { 
    // return false 
    //} 
    // TODO: how to check for? Optional(_SwiftValue) 
    print("class for coder: \(object.classForCoder)") 
    return true 
} 
+0

Das Problem ist noch nicht gelöst. Wenn ich einen String übergebe, denkt er, dass es null ist. Wo sollte es denken, dass es nicht Null ist. Daher bin ich unermüdlich, dass dies die Antwort ist. – neoneye

Verwandte Themen