使用 AnyObject 时 Bool 被视为 int

Posted

技术标签:

【中文标题】使用 AnyObject 时 Bool 被视为 int【英文标题】:Bool being seen as int when using AnyObject 【发布时间】:2015-03-19 17:42:51 【问题描述】:

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

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

如何将其保存为实际的真/假值而不是整数?

注意事项

这是和AFNetworking一起使用的,所以参数必须是AnyObject!的形式

AFNetworking结构如下:

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

“参数”参数是我在 Dictionary&lt;String,AnyObject&gt; 中传递的内容。

【问题讨论】:

@MartinR Web 服务目前不是问题,但它作为 application/json 发送。问题是 AnyObject 类型将 Bool 转换为 int 而不是 true/false。 我没有使用 AFNetworking 的经验,但 NSJSONSerialization 确实可以正确处理。 @MartinR 您对网络服务的初步想法似乎是问题所在。似乎 web 服务需要一个字符串 true/false,因为当它收到一个应该可以正常工作的 0/1 时,它每次都会做出反应,就好像它是 false 一样。如果我使用字符串“true”/“false”,没有问题。 【参考方案1】:

代替:

var params = Dictionary<String,AnyObject>()

试试:

var params = Dictionary<String,Any>()

Any 可以表示任何类型的实例,包括函数 类型。

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

在这种情况下,您似乎需要一个 Dictionary 并且该服务期望“true”而不是 bool 值。

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

示例:

param["tester"] = strFromBool(true)

然后定义函数 strFromBool 接受一个 bool 参数并根据其值返回“true”或“false”。

【讨论】:

所以,我正在使用 AFNetworking,GET、POST、DELETE 等方法需要“AnyObject!”形式的参数,这是我没有意识到的。这限制了我使用 Any 不符合的那种数据类型。 作为参考,在尝试使用 AFNetworking 方法时,我收到“类型 Dictionary 不符合 AnyObject”错误。 您能否将结果存储为字符串并根据布尔值决定将哪个字符串输入到字典中?即 param["tester"] = "true" 因为您似乎不需要在本地使用 bool,而是将其发送到服务。 您也可以将其存储在本地,但只需将布尔值转换为字符串即可。参数 ["tester"] = strFromBool(true).这样,如果需要,您可以将其传递给变量 这似乎工作正常。虽然它并不理想(这意味着有一些用例警告。我将其打包以在多个应用程序中使用。),它确实有效。不过,我不确定我是否看到了其他解决方法。【参考方案2】:

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

您可以尝试将其强制转换以测试 Bool:

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

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

这是安全的做法。

【讨论】:

问题是它以 "tester":1 而不是 "tester":true 的形式访问服务,这是不被接受的。 啊,我误会了。将值直接包装到 NSNumber 中怎么样 - params["tester"] = NSNumber(bool: true) 我不想要号码。我希望它保存到参数数组中并作为真/假发送。我正在添加一些上述代码以进一步澄清。 我知道,但您需要某种方式向 AFNetworking 发出信号,表明您希望该事物成为布尔值。将 NSNumber 对象中的值装箱是一种方法。 这仍然作为数字发送,而不是真/假。

以上是关于使用 AnyObject 时 Bool 被视为 int的主要内容,如果未能解决你的问题,请参考以下文章

boost::variant 与 bool 和 string

UIWebView 中的链接被视为 UIWebViewNavigationTypeOther

转换非托管<AnyObject>!在 Swift 中使用布尔值

在swift中连接:二进制运算符'+'不能应用于'String'和'AnyObject'类型的操作数

Alamofire 4 多部分

Python学习6——条件,循环语句