无法将类型“__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
/ Array
和 NSMutable...
对应项与彼此,在 Swift 中,您可以简单地使用 var
关键字使(本机)类型可变。
这么写
var json = try JSONSerialization.jsonObject(with: responseData) as! [String:Any]
底线是:
根本不要在 Swift 中使用 NSMutable...
集合类型。
我最近开始使用 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
/ Array
和 NSMutable...
对应项与彼此,在 Swift 中,您可以简单地使用 var
关键字使(本机)类型可变。
这么写
var json = try JSONSerialization.jsonObject(with: responseData) as! [String:Any]
底线是:
根本不要在 Swift 中使用 NSMutable...
集合类型。