使用 AnyObject 时 Bool 被视为 int

Bool being seen as int when using AnyObject

我在 Swift iOS 应用程序中使用 Dictionary<String,AnyObject> 类型的参数列表来保存一些最终将传递给网络服务的参数。如果我要将一个 Bool 保存到这个字典然后打印它,它显示为 "Optional(1)",因此它被转换为一个 int。我不能发送一个 int 并且需要它是 "true"。下面的示例代码。

var params = Dictionary<String,AnyObject>()
params["tester"] = true
println(params["tester"])

如何将其保存为实际 true/false 值而不是整数?

注意事项

这是与 AFNetworking 一起使用的,因此参数的格式必须是 AnyObject!

AFNetworking结构如下:

manager.GET(<#URLString: String!#>, parameters: <#AnyObject!#>, success: <#((AFHTTPRequestOperation!, AnyObject!) -> Void)!##(AFHTTPRequestOperation!, AnyObject!) -> Void#>, failure: <#((AFHTTPRequestOperation!, NSError!) -> Void)!##(AFHTTPRequestOperation!, NSError!) -> Void#>)

'parameters' 参数是我在 Dictionary<String,AnyObject> 中传递的内容。

而不是:

var params = Dictionary<String,AnyObject>()

尝试:

var params = Dictionary<String,Any>()

Any can represent an instance of any type at all, including function types.

文档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_448

在这种情况下,您似乎需要一个字典,并且服务需要 "true" 而不是 bool 值。

我建议创建一个函数来将您的 bool 值转换为 String 并使用它来设置您的参数["tester"]。

示例:

param["tester"] = strFromBool(true)

然后定义函数 strFromBool 以接受 bool 参数和 return "true" 或 "false" 取决于它的值。

true确实是1,所以不是不准确;它实际上是在存储 Bool,但由于它以 AnyObject 的形式从另一端输出,它只是将其作为整数打印出来,因为它不知道确切的类型。

您可以尝试转换它来测试 Bool:

var params = Dictionary<String,AnyObject>()
params["tester"] = true

if let boolValue = params["tester"] as? Bool {
  println("\(boolValue)")
}

这是安全的方法。