无法将类型“__NSDictionaryI”的值转换为 'NSMutableDictionary'

Could not cast value of type '__NSDictionaryI' to 'NSMutableDictionary'

我最近开始使用 swift。我正在使用下面的代码将字符串转换为 nsmutabledictionary。

print(response);
let responseData = response.data(using: .utf8)!
var json: NSMutableDictionary = try JSONSerialization.jsonObject(with: responseData, options: []) as! NSMutableDictionary;

服务器对请求的响应如下。

{"token1":"blah.blah.blah","token_type":"smarty","expires_in":1209600,"token2":"blah.blah.blah"}

我被困在这里了。请帮忙。

jsonObject(with:options:) returns Any, 你可以试试:

let response = """
    {"token1":"blah.blah.blah","token_type":"smarty","expires_in":1209600,"token2":"blah.blah.blah"}
"""
let responseData = response.data(using: .utf8)!
let json = try JSONSerialization.jsonObject(with: responseData, options: []) as! [String: Any]
let mutableDictionary = NSMutableDictionary(dictionary: json)

这并不奇怪,因为它与 Objective-C.

中的行为完全相同

在 ObjC 中,您不能将不可变类型转换为可变类型。 运行 这个代码

NSDictionary *dict = @{@"Foo":@"1"};
NSMutableDictionary *mutableDict = (NSMutableDictionary *)dict;
[mutableDict setObject:@"2" forKey: @"Bar"];

引发异常

-[__NSSingleEntryDictionaryI setObject:forKey:]: unrecognized selector sent to instance

因为类型保持不变。您必须创建一个新的 NSMutableDictionary 实例

NSMutableDictionary *mutableDict = [NSMutableDictionary dictionaryWithDictionary:dict];

具有讽刺意味的是——我还在谈论 ObjC——在 NSJSONSerialization 的情况下,著名的选项 .mutableContainers 出现了。使用这个选项你可以直接创建一个可变数组/字典,请注意,仅在 Objective-C.

另一方面,在 Swift 中这个选项无论如何都没有意义,因为 Swift Dictionary / ArrayNSMutable... 对应项与彼此,在 Swift 中,您可以简单地使用 var 关键字使(本机)类型可变。

这么写

var json = try JSONSerialization.jsonObject(with: responseData) as! [String:Any]

底线是:

根本不要在 Swift 中使用 NSMutable... 集合类型。