我在NSDictionary
上创建了一个类别,以便制作副本,并对所有键应用某些固定修改(在将对象映射到Web服务时使用):
@implementation NSDictionary (TransformKeys)
- (NSDictionary*) dictionaryByTransformingKeysWithBlock:(NSString* (^)(NSString* key))block
{
NSMutableDictionary* transformedDictionary = [NSMutableDictionary new];
for(NSString* key in [self allKeys]){
// Transform the key string:
NSString* transformedKey = block(key);
// Copy value, using modified key in target dictionary:
[transformedDictionary setObject:[self objectForKey:key]
forKey:transformedKey];
}
return transformedDictionary;
}
@end
所以我可以将@{ @"userName" : @"John"}
映射到{@"UserName" : @"John"}
要用作所述键转换的一部分,我还在NSString
上定义了一个类别来提高第一个字符的大小写:
@implementation NSString (Camel)
- (NSString*) stringByCapitalizingFirstCharacter
{
if ([self length] == 0){
return @"";
}
NSString* firstCharacter = [self substringToIndex:1];
firstCharacter = [firstCharacter uppercaseString];
if ([self length] == 1) {
return firstCharacter;
}
NSString* theRest = [self substringFromIndex:1];
return [firstCharacter stringByAppendingString:theRest];
}
@end
当然,键是通过Objective-C运行时内省获得的对象的属性名称。
当我使用allKeys
向控制台打印我的字典 - 或其NSLog()
数组无关紧要时,某些键用引号括起来,而其他键按原样打印
直接原因似乎是我正在按照两个不同的规则转换我的字典键,并且它们以某种方式打印不同:
如果我通过大写第一个字符来转换我的键,则按原样打印:
NSDictionary* convertedDictionary = [dictionary dictionaryByTransformingKeysWithBlock:^NSString *(NSString *key) {
return [key stringByCapitalizingFirstCharacter];
}];
// -> Dictionary keys are printed to console as-is; i.e. UserName
如果我通过大写然后附加后缀来转换我的键,则它们用双引号括起来:
NSDictionary* convertedDictionary = [dictionary dictionaryByTransformingKeysWithBlock:^NSString *(NSString *key) {
NSString* capitalized = [key stringByCapitalizingFirstCharacter];
return [capitalized stringByAppendingString:@"__c"];
}];
// -> Dictionary keys are printed to console in quotation marks; i.e. "UserName"
我确定它只是一个日志工件,实际的字符串中不包含"
,但它有点烦人。
有没有办法统一控制台中所有键的显示?我错过了什么吗?
我将字典转换为JSON(无论如何我最终都会这样做)并尝试记录:
NSData* data = [NSJSONSerialization dataWithJSONObject:[dictionary allKeys]
options:NSJSONWritingPrettyPrinted
error:nil];
NSLog(@"Keys: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
现在所有的键均匀地用引号括起来(如预期的那样),这样就可以确认我的内部数据是预期的格式,并且由于日志中观察到的差异而不会出现任何问题......
答案 0 :(得分:1)
虽然我无法用任何文档来支持这一点,但是通过快速测试和花费大量时间查看日志,似乎任何包含非字母数字字符(包括空格)的键都将使用双引号记录(和这就是你使用showGet.then(function(thisParameterShouldBeUndefined) {
console.log(thisParameterShouldBeUndefined);
});
后缀
所以,这个:
__
会记录:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
NSDictionary *dict = @{
@"simple": @"",
@"camelCase": @"",
@"camelCaseWith__suffix": @"",
@"camelCaseWith space": @"",
@"camelCaseWith/special": @""
};
NSLog(@"%@", dict);
}
}