处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是啥的情况下将任何类型转换为 NSString
Posted
技术标签:
【中文标题】处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是啥的情况下将任何类型转换为 NSString【英文标题】:Deal with requestAttributionDetailsWithBlock and NSDictionary. Convert any type to NSString without knowing what exactly it is处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是什么的情况下将任何类型转换为 NSString 【发布时间】:2017-10-26 02:16:59 【问题描述】:NSString *str = nil;
NSString *key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding];
str = [attributionDetails valueForKey:key];
在这种情况下,我想将 [attributionDetails valueForKey:key] 转换为 NSString。但我不知道它到底是什么,可能是整数或字符串或布尔值,我只是希望将它们全部转换为 NSString。那么我该如何解决这个问题呢?
更新:
NSString* key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding];
NSObject* obj = [attributionDetails valueForKey:key];
NSString* str = (NSString*)obj;
我可以这样解决问题吗?我把值不管是什么类型都传给一个NSObject,然后把NSObject转成NSString。
更新2: 整个方法如下。它会起作用吗?
char* _getIad(char* attr)
NSString* str = nil;
[[ADClient sharedClient] requestAttributionDetailsWithBlock:
^(NSDictionary *attributionDetails, NSError *error)
if(error.code == ADClientErrorLimitAdTracking)
return;
if(!error)
NSString* key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding];
NSObject* obj = [attributionDetails valueForKey:key];
str = (NSString*)obj;
return;
];
return strdup([str UTF8String]);
【问题讨论】:
鉴于您不知道结果是什么,您希望如何格式化结果?您可以在对象上调用-description
将其转换为字符串,但这并不意味着结果将采用对您有用的格式...
@Itai Ferber 嗯,attributionDetails 是 NSDictionary 的一个对象,它可能包含整数、字符串和布尔值。这就是我所知道的。但是我想要一种通用的方法来将值传递给 NSString 对象,无论值是什么类型。我只需要存储价值,而不是使用它。
【参考方案1】:
创建一个数学或类别,如果 xx 是 NSString 类,则使用,否则如果 nil 或布尔值,则返回转换值
【讨论】:
【参考方案2】:从NSObject
类派生的每个类型都实现了协议NSObject
,并且该协议具有以下方法:
description
必填。返回一个描述接收者内容的字符串。
所以它得到你可以做的字符串:
str = attributionDetails[key].description;
description
返回的字符串是出于显示 的目的,并不要求它很容易解析回它所描述的值,但是因为您“只需要存储该值,不使用它”就足够了。
HTH
【讨论】:
需要明确的是,description
的输出永远不应该用于向用户显示。它应该只用于调试。而且你绝不能依赖它的格式。它可以在任何 ios 更新中更改。
如果 attributionDetails[key] 是一种原始类型怎么办?它们是 NSObject 的后代吗?
@Frank.W - NSDictionary
(或任何 NS 集合类)仅包含对象类型。对于这样一个集合中的原始类型,它必须被包装为一个对象,例如NSNumber
.
@rmaddy - 我认为这是一个很好的建议,而不是绝对规则,出于调试目的,有可选的协议方法debugDescription
。也就是说,虽然目前尚不清楚 OP 为什么要寻求这种字符串转换,但它似乎不是为了 UI 目的。以上是关于处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是啥的情况下将任何类型转换为 NSString的主要内容,如果未能解决你的问题,请参考以下文章