为什么在 Swift3 中 NSUserDefaults 的布尔值显示为 0 而不是 "false"?

Why does in Swift3 boolean value from NSUserDefaults is visible as 0 instead of "false"?

在我的 Swift 应用程序中,我将布尔值保存到 NSUserDefaults:

defaults.set(false, forKey: "mySwitch")
defaults.set(true, forKey: "mySecondSwitch")

稍后,当我构造对 alamofire 的查询时:

var params = [
        "switch1": defaults.bool(forKey: "mySwitch") as AnyObject
    ] as [String: AnyObject]

并使用 print(params) 打印参数我看到 switch1 = 0。我怎样才能让它以 switch1 = false 的形式传输到服务器?

我不能改变数组的结构,它必须保持 [String: AnyObject]

每当您将 Bool 转换为 AnyObject 时,true 变为 1 而 false 变为 0。我不认为这种行为无法改变。

// prints 1
print(true as AnyObject)

我能想到的唯一解决方法是:

var params = [
    "switch1": defaults.bool(forKey: "mySwitch").description as AnyObject
    ] as [String: AnyObject]
print(params)

如您所见,我在 as AnyObject 之前访问了 description。输出如下所示:

["switch1": false]

显然,"switch1" 得到那些引号但 false 没有。

请注意,我对 Alamofire 一无所知,所以我不知道将 ["switch1": false] 作为参数发送到服务器是否有效。

在 Swift 3 中不要使用 AnyObject 而是使用 Any.

所以像下面这样更改代码,

var params = [
        "switch1": defaults.bool(forKey: "mySwitch") as Bool
    ] as [String: Bool]

或者如果包含多种类型的参数,则如下所示,

var params = [
        "switch1": defaults.bool(forKey: "mySwitch") as Bool
    ] as [String: Any]

一般来说,BOOL 总是一个包含 0 or 1 的整数,这意味着

如果陈述属实,它将 return 1 个赞

    if(_bool){

    //its mean if _bool ==1 then execute this 
    }else{

//its mean if _bool ==0 then execute this 
}

这是 NSArray 不包含 int 值但 NSMutableArray 可以包含 int 值的原因之一