2016-10-24 14 views
1

swift3からは、確実にnil/NSNullを検出することができません。このスニペットでは、nilの代わりに、私はOptional(_SwiftValue)値を取得していますが、これは検出方法がわかりません。オプション(_SwiftValue)が含まれている場合、nil/NSNull/optionalをチェックする方法

私は運がなくchecking classForCoderを試しました。

は、他の場所で、私はJSONSerialization.data()に渡す前に私のデータをサニタイズする必要が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 
} 

あります。したがって、私は検出する必要がありますOptional(_SwiftValue)

+0

が見えます。 – rmaddy

+0

これはディクショナリに 'Optional(_SwiftValue)'を挿入できる最小のスニペットです。それは醜いです。開発者に公開されていない内部型ですか?それとも迅速な開発者が対処しなければならないものなのでしょうか?オプション(_SwiftValue)を検出する方法 – neoneye

答えて

2

String?は、Optional<String>の略です。それが無ければ、実際にはOptional<String>.noneと表示されます。これは、Null以外のものとしてAnyObjectであるため、テストは機能しませんでした。

あなたはこのようにそれを修正することができます: `VARの辞書= [文字列:ANYOBJECT]`あなたは `dict`への1つの小さな変更を加える場合は、期待どおりの結果を得るよう

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

問題はまだ解決されていません。私が文字列を渡すと、文字列はゼロであると考えられます。それはそれがゼロではないと考えるべきところ。だから、私はこれを答えであると断言しています。 – neoneye

関連する問題