【问题标题】:Swift 2: How can i assign a dictionary to AnyObject?Swift 2:如何将字典分配给 AnyObject?
【发布时间】:2015-09-30 07:37:27
【问题描述】:

我使用的是 swift 1.2,一切正常。将我的 Xcode 升级到 7 后。我遇到了一些奇怪的问题。

我的代码是:

let postData : AnyObject = ["username":username , "password":password] ;

我需要这个变量是 AnyObject,因为

    let jsonObject : AnyObject = postData ;
    let jsonString = JSONStringify(jsonObject)
    let data1 = jsonString.dataUsingEncoding(NSUTF8StringEncoding)

    let task1 = NSURLSession.sharedSession().uploadTaskWithRequest(request, fromData: data1) {
        (Data, Response, Error) -> Void in

需要一个 Anyobject 用于发布数据标头。

错误是

 Value of type '[String : String?]' does not conform to specified type 'AnyObject' 

谁能帮帮我?

【问题讨论】:

  • dispatch_async 是一个GCD 命令,与网络完全无关。你的 postData : AmyObject ... 在 Xcode 7 中运行良好。
  • 有什么问题?错误是什么?
  • @Adam 谢谢你的回答,这里贴错了函数。对不起。
  • @DejanSkledar 问题是让 postData : AnyObject = ["username":username , "password":password] ;使“[String : String?]”类型的值不符合指定类型“AnyObject”错误
  • @EhsanRazmkhah 我在问题中添加了错误消息,因为它是诊断问题的重要线索。

标签: swift swift2


【解决方案1】:

问题是您的密码变量是Optional<String>。这意味着从 Swift 字典到 AnyObject 的转换(我认为它会尝试将其转换为 NSDictionary)将失败。

如果你这样做了

let postData : AnyObject = ["username":username , "password":password!]

除非密码为 nil,否则它应该可以工作(在创建字典之前检查)

如果您希望能够在输出中包含空密码,您可以在字典中执行此操作

let postData : [String : AnyObject] = ["username":username , "password":password ?? NSNull()]

以下作品

let pw: String? = "pw"
let pw2: String? = nil
var foo: [String : AnyObject] = ["bar" : pw ?? NSNull(), "baz" : pw2 ?? NSNull()]

let data = try NSJSONSerialization.dataWithJSONObject(foo, options: NSJSONWritingOptions.PrettyPrinted)

let str = NSString(data: data, encoding: NSUTF8StringEncoding)!

print(str)

然后打印

{
  "baz" : null,
  "bar" : "pw"
}

【讨论】:

  • 让 postData : AnyObject = ["username":username , "password":password!] 仍然返回错误。有时 postdata 可能为空,而不仅仅是值。我需要它是空的。类似于 let postData: AnyObject = ""
【解决方案2】:

我假设您将参数传递给一个请求,该请求需要键为String,值可以是AnyObject。试试这个:

let postData: [String: AnyObject] = ["username":username , "password":password]

还要确保用户名和密码不是可选的,在这种情况下,如果您确定存在值,请使用! 将其解包。

let postData: [String: AnyObject] = ["username":username!, "password":password!]

或者你可以使用

let postData: [String: AnyObject] = ["username":username ?? "", "password":password ?? ""]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多