NSString使用引号记录到控制台,有时

时间:2016-04-06 09:41:04

标签: objective-c nsstring nslog

背景

我在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()数组无关紧要时,某些键用引号括起来,而其他键按原样打印

直接原因似乎是我正在按照两个不同的规则转换我的字典键,并且它们以某种方式打印不同:

  1. 如果我通过大写第一个字符来转换我的键,则按原样打印:

    NSDictionary* convertedDictionary = [dictionary dictionaryByTransformingKeysWithBlock:^NSString *(NSString *key) {
    
        return [key stringByCapitalizingFirstCharacter];
    }];
    // -> Dictionary keys are printed to console as-is; i.e. UserName
    
  2. 如果我通过大写然后附加后缀来转换我的键,则它们用双引号括起来:

    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"
    
  3. 我确定它只是一个日志工件,实际的字符串中不包含",但它有点烦人。

    有没有办法统一控制台中所有键的显示?我错过了什么吗?

    更新

    我将字典转换为JSON(无论如何我最终都会这样做)并尝试记录:

    NSData* data = [NSJSONSerialization dataWithJSONObject:[dictionary allKeys]                                                    
                                                   options:NSJSONWritingPrettyPrinted
                                                     error:nil];
    
    NSLog(@"Keys: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    

    现在所有的键均匀地用引号括起来(如预期的那样),这样就可以确认我的内部数据是预期的格式,并且由于日志中观察到的差异而不会出现任何问题......

1 个答案:

答案 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);
    }
}