当涉及可选(_SwiftValue)时,如何检查nil/NSNull/optional

当涉及可选(_SwiftValue)时,如何检查nil/NSNull/optional,swift,swift3,Swift,Swift3,从swift3开始,我很难可靠地检测到nil/NSNull。在这里的代码片段中,我得到的不是nil,而是一个可选(\u SwiftValue)值,我不知道如何检测 我试过了,但运气不好 其他地方也有 func testVotingMachine(){ 让我们投票:String?=nil//可以是String或nil //让我们投票:字符串?=“总统”//可以是字符串或零 var dict=[String:AnyObject?]() dict[“投票”]=作为任何对象投票? 让obj:AnyObj

从swift3开始,我很难可靠地检测到nil/NSNull。在这里的代码片段中,我得到的不是
nil
,而是一个
可选(\u SwiftValue)
值,我不知道如何检测

我试过了,但运气不好

其他地方也有

func testVotingMachine(){
让我们投票:String?=nil//可以是String或nil
//让我们投票:字符串?=“总统”//可以是字符串或零
var dict=[String:AnyObject?]()
dict[“投票”]=作为任何对象投票?
让obj:AnyObject?=作为AnyObject记录?
guard let dict2=obj as?字典其他{
法塔莱罗()
}
让value=dict2[“投票”]作为任何对象?
let didVote=notNil(objectOrNil:value)
xctasertfalse(didVote)//BOOM!notNil()无法检测到nil
}
func notNil(objectOrNil:AnyObject?->Bool{
保护let对象:AnyObject=objectOrNil else{
返回错误
}
如果对象为空{
返回错误
}
//如果object.classForCoder==NSNull.classForCoder(){
//返回错误
//}
//TODO:如何检查?可选(\u SwiftValue)
打印(“编码器类:\(object.classForCoder)”)
返回真值
}

在将数据传递到
JSONSerialization.data()
之前,我需要对数据进行清理。因此,我需要检测
可选(\u SwiftValue)

一个
字符串?
可选的缩写。当它为nil时,它实际上表示为
可选。none
,它限定为非nil
AnyObject
,因此测试不起作用

您可以这样修复它:

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
}

如果您对
dict
var-dict=[String:AnyObject]
做一个小小的更改,看起来您会得到预期的结果。这是我能做的最小的片段,可以将
可选(\u SwiftValue)
插入字典。很难看。它是一种不应该向开发人员公开的内部类型。或者这是敏捷开发人员必须处理的问题。如何检测
可选(\u SwiftValue)
。问题尚未解决。如果我传入一个字符串,它会认为是零。它应该认为它不是零。因此,我坚持认为这是答案。
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
}