尝试将 NSDictionary 从 swift class 传递到 objective c class 时发送到实例的无法识别的选择器
Unrecognized selector sent to instance when trying to pass NSDictionary from swift class to objective c class
我在 swift 中有一个 class,它使字典在键中使用字符串,在值中使用对象。例如 let dict = ["key":value.key]
。该值始终是一个字符串。
当我在 objective c class 中获取数据时,其中一个对象类型是
_TtGCs26_SwiftDeferredNSDictionaryVs11AnyHashableP__$
并且代码需要 nsdictionary。
现在当代码 -
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionaryFromSwiftClass];
被执行,程序抛出错误
********[1235:641121] -[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x280571380
//making dict in swift class
let dictForAddToCart:NSDictionary =
[
"assoc_prod":[
["assoc_prodID":"92",
"assoc_prodValue":currentSelectedColor,
"productInfo":[
"code":productInfoColor.value(forKey: "code"),
"id":productInfoColor.value(forKey: "id"),
"image":productInfoColor.value(forKey: "image"),
"label":productInfoColor.value(forKey: "label"),
"optionslabel":productInfoColor.value(forKey: "optionslabel"),
"price":productInfoColor.value(forKey: "price"),
"qty":productInfoColor.value(forKey: "qty")]],
["assoc_prodID":"92",
"assoc_prodValue":currentSelectedColor,
"productInfo":[
"code":productInfoColor.value(forKey: "code"),
"id":productInfoColor.value(forKey: "id"),
"image":productInfoColor.value(forKey: "image"),
"label":productInfoColor.value(forKey: "label"),
"optionslabel":productInfoColor.value(forKey: "optionslabel"),
"price":productInfoColor.value(forKey: "price"),
"qty":productInfoColor.value(forKey: "qty")]]
]
"productData":productData,
"qty":currentSelectedQuantity
] as NSDictionary
//saving object in objective c class
- (void)saveCartArray:(NSArray *)arrayToSave {
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:arrayToSave.count];
for (NSMutableDictionary* productDic in arrayToSave) {
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
[archiveArray addObject:productDicData];
}
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"cart"];
}
//NSLOG of arrayToSave-
{
"assoc_prod" = (
{
"assoc_prodID" = 92;
"assoc_prodValue" = 396;
code = "********.Code.color";
id = 92;
image = "********.Image.empty";
label = "********.Label.color";
optionslabel = Nude;
price = "280.0000";
qty = "0.0000";
},
{
"assoc_prodID" = 180;
"assoc_prodValue" = 388;
code = "********.Code.size";
id = 180;
image = "********.Image.empty";
label = "********.Label.size";
optionslabel = 36;
price = "280.0000";
qty = "0.0000";
}
);
productData = {
additionalParameters = (
);
associatedProd = "someData";
brand = "";
categoryId = 378;
description = "";
image = "http://www.x.com/xyz.jpg";
link = "";
linkDownloads = "";
name = some;
position = 0;
price = 280;
productId = 1421;
qty = 0;
set = 0;
shortDescription = "";
sku = some;
type = some;
wsp = "";
};
qty = 1;
}
)
我有预感这是我在这里回答的类似问题:
您的情况会因此而略有不同:
- (void)saveCartArray:(NSArray *)arrayToSave {
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:arrayToSave.count];
for (NSMutableDictionary* productDic in arrayToSave) {
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
[archiveArray addObject:productDicData];
}
所以基本上如果我理解正确的话 Swift 桥接 SwiftDeferredNSDictionary
是 NSArray*
中的元素。
如果你能提取
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
到一个单独的方法,例如:
-(NSData*)dictionaryToData:(NSDictionary*)dic {
return [NSKeyedArchiver archivedDataWithRootObject:productDic];
}
并使用我的链接答案解决方法:
func mySwiftFunc(dic: Dictionary) {
myObjcClassInstance.perform(#selector(NSSelectorFromString("dictionaryToData:"), with: dic as NSDictionary)
}
您可以确保处理 “真实” NSDictionary
并避免隐式 __SwiftValue
桥接。
我在 swift 中有一个 class,它使字典在键中使用字符串,在值中使用对象。例如 let dict = ["key":value.key]
。该值始终是一个字符串。
当我在 objective c class 中获取数据时,其中一个对象类型是
_TtGCs26_SwiftDeferredNSDictionaryVs11AnyHashableP__$
并且代码需要 nsdictionary。
现在当代码 -
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionaryFromSwiftClass];
被执行,程序抛出错误
********[1235:641121] -[__SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x280571380
//making dict in swift class
let dictForAddToCart:NSDictionary =
[
"assoc_prod":[
["assoc_prodID":"92",
"assoc_prodValue":currentSelectedColor,
"productInfo":[
"code":productInfoColor.value(forKey: "code"),
"id":productInfoColor.value(forKey: "id"),
"image":productInfoColor.value(forKey: "image"),
"label":productInfoColor.value(forKey: "label"),
"optionslabel":productInfoColor.value(forKey: "optionslabel"),
"price":productInfoColor.value(forKey: "price"),
"qty":productInfoColor.value(forKey: "qty")]],
["assoc_prodID":"92",
"assoc_prodValue":currentSelectedColor,
"productInfo":[
"code":productInfoColor.value(forKey: "code"),
"id":productInfoColor.value(forKey: "id"),
"image":productInfoColor.value(forKey: "image"),
"label":productInfoColor.value(forKey: "label"),
"optionslabel":productInfoColor.value(forKey: "optionslabel"),
"price":productInfoColor.value(forKey: "price"),
"qty":productInfoColor.value(forKey: "qty")]]
]
"productData":productData,
"qty":currentSelectedQuantity
] as NSDictionary
//saving object in objective c class
- (void)saveCartArray:(NSArray *)arrayToSave {
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:arrayToSave.count];
for (NSMutableDictionary* productDic in arrayToSave) {
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
[archiveArray addObject:productDicData];
}
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"cart"];
}
//NSLOG of arrayToSave-
{
"assoc_prod" = (
{
"assoc_prodID" = 92;
"assoc_prodValue" = 396;
code = "********.Code.color";
id = 92;
image = "********.Image.empty";
label = "********.Label.color";
optionslabel = Nude;
price = "280.0000";
qty = "0.0000";
},
{
"assoc_prodID" = 180;
"assoc_prodValue" = 388;
code = "********.Code.size";
id = 180;
image = "********.Image.empty";
label = "********.Label.size";
optionslabel = 36;
price = "280.0000";
qty = "0.0000";
}
);
productData = {
additionalParameters = (
);
associatedProd = "someData";
brand = "";
categoryId = 378;
description = "";
image = "http://www.x.com/xyz.jpg";
link = "";
linkDownloads = "";
name = some;
position = 0;
price = 280;
productId = 1421;
qty = 0;
set = 0;
shortDescription = "";
sku = some;
type = some;
wsp = "";
};
qty = 1;
}
)
我有预感这是我在这里回答的类似问题:
您的情况会因此而略有不同:
- (void)saveCartArray:(NSArray *)arrayToSave {
NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:arrayToSave.count];
for (NSMutableDictionary* productDic in arrayToSave) {
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
[archiveArray addObject:productDicData];
}
所以基本上如果我理解正确的话 Swift 桥接 SwiftDeferredNSDictionary
是 NSArray*
中的元素。
如果你能提取
NSData *productDicData = [NSKeyedArchiver archivedDataWithRootObject:productDic];
到一个单独的方法,例如:
-(NSData*)dictionaryToData:(NSDictionary*)dic {
return [NSKeyedArchiver archivedDataWithRootObject:productDic];
}
并使用我的链接答案解决方法:
func mySwiftFunc(dic: Dictionary) {
myObjcClassInstance.perform(#selector(NSSelectorFromString("dictionaryToData:"), with: dic as NSDictionary)
}
您可以确保处理 “真实” NSDictionary
并避免隐式 __SwiftValue
桥接。