Ios 处理RequestAttributeDetailsWithBlock和NSDictionary。将任何类型转换为NSString,而不知道其确切含义
在本例中,我想将[AttributeDetails valueForKey:key]转换为NSString。但我不知道它到底是什么,可能是int、string或boolean,我只想把它们都转换成NSString。那么我该如何解决这个问题呢 更新:Ios 处理RequestAttributeDetailsWithBlock和NSDictionary。将任何类型转换为NSString,而不知道其确切含义,ios,objective-c,nsstring,Ios,Objective C,Nsstring,在本例中,我想将[AttributeDetails valueForKey:key]转换为NSString。但我不知道它到底是什么,可能是int、string或boolean,我只想把它们都转换成NSString。那么我该如何解决这个问题呢 更新: NSString *str = nil; NSString *key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding]; str
NSString *str = nil;
NSString *key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding];
str = [attributionDetails valueForKey:key];
我可以用这种方法解决这个问题吗?我将值传递给NSObject,不管它是什么类型,然后将NSObject转换为NSString
更新2:
整个方法如下。行吗
NSString* key = [[NSString alloc] initWithCString:(const char*)attr encoding:NSUTF8StringEncoding];
NSObject* obj = [attributionDetails valueForKey:key];
NSString* str = (NSString*)obj;
创建一个mathod或category,如果xx是NSString类,只需使用,否则为nil或booleans,然后返回转换值创建一个mathod或category,如果xx是NSString类,只需使用,否则为nil或booleans,然后返回转换值从类
NSObject
派生的每个类型实现协议NSObject
,该协议具有以下方法:
说明
必需。返回描述接收器内容的字符串
因此,它可以获取您的字符串,您只需执行以下操作:
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
返回的字符串用于显示目的,不需要很容易解析回它所描述的值,但由于您“只需要存储值,而不是使用它”,所以应该足够了
HTH从类
NSObject
派生的每个类型实现协议NSObject
,该协议具有以下方法:
说明
必需。返回描述接收器内容的字符串
因此,它可以获取您的字符串,您只需执行以下操作:
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
返回的字符串用于显示目的,不需要很容易解析回它所描述的值,但由于您“只需要存储值,而不是使用它”,所以应该足够了
HTH在您不知道结果是什么的情况下,您希望如何格式化结果?您可以对对象调用
-description
,将其转换为字符串,但这并不意味着结果的格式对您有用…@Itai Ferber嗯,AttributeDetails是NSDictionary的一个对象,它可能包含整数、字符串和布尔值。这就是我所知道的。但是我需要一种通用的方法来将值传递给NSString对象,不管该值是什么类型的。我只需要存储值,而不是使用它。如果你不知道结果是什么,你希望结果如何格式化?您可以对对象调用-description
,将其转换为字符串,但这并不意味着结果的格式对您有用…@Itai Ferber嗯,AttributeDetails是NSDictionary的一个对象,它可能包含整数、字符串和布尔值。这就是我所知道的。但是我需要一种通用的方法来将值传递给NSString对象,不管该值是什么类型的。我只需要存储值,而不是使用它。为了清楚起见,description
的输出永远不应该用于显示给用户。它只能用于调试。你决不能依赖它的格式。它可以在任何iOS更新中更改。如果AttributeDetails[key]是一种基本类型呢?它们是从NSObject派生的吗?@Frank.W-anNSDictionary
(或任何NS集合类)只包含对象类型。对于要包含在此类集合中的基元类型,必须将其包装为对象,例如NSNumber
@rmaddy-我认为这是一个很好的建议,而不是一个绝对规则,出于调试目的,有可选的协议方法debugDescription
。也就是说,虽然不清楚OP为什么要寻求这种字符串转换,但它似乎不是出于用户界面的目的。更清楚的是,description
的输出不应用于向用户显示。它只能用于调试。你决不能依赖它的格式。它可以在任何iOS更新中更改。如果AttributeDetails[key]是一种基本类型呢?它们是从NSObject派生的吗?@Frank.W-anNSDictionary
(或任何NS集合类)只包含对象类型。对于要包含在此类集合中的基元类型,必须将其包装为对象,例如NSNumber
@rmaddy-我认为这是一个很好的建议,而不是一个绝对规则,出于调试目的,有可选的协议方法debugDescription
。也就是说,虽然不清楚OP为什么要寻求这种字符串转换,但它似乎不是出于UI目的。