处理 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的主要内容,如果未能解决你的问题,请参考以下文章

自然语言处理_一般处理流程

怎么在批处理中加回车命令?

throws关键字_异常处理的第一种方式(交给别人处理)和try_catch_异常处理的第二种方式(自己处理)

PHP异常处理

协处理器,王明学learn

批处理学习笔记第一课:什么是批处理