2

我正在做一个项目,我希望能够处理一些模板类型的消息。该模板将包含以下内容:

"{{user1}} has just created an account"

然后,我有一个数据映射,它将为您提供 NSMutableDictionary 中数据所在的位置:

"activity.message.status"

然后我希望能够通过拆分该字符串来查询 NSMutableDictionary,使其变为:

[[[myDictionary objectForKey:@"activity"] objectForKey:@"message"] objectForKey:@"status"]

我可以做一些东西,只要它是 3 弦,但有些可能或多或少。

任何帮助将不胜感激。

4

4 回答 4

1

它实际上比将字符串拆分为键要容易得多。Apples Key-Value-Coding 正是您想要的。

[myDictionary valueForKeyPath:@"activity.message.status"];

键路径是一串点分隔键,用于指定要遍历的对象属性序列。序列中第一个键的属性是相对于接收者的,并且每个后续键都相对于前一个属性的值进行评估。

例如,关键路径 address.street 将从接收对象中获取地址属性的值,然后确定相对于地址对象的街道属性。

键值编码编程指南

于 2012-06-10T12:03:03.783 回答
0

你会做类似的事情,

NSArray *array = [@"activity.message.status" componentsSeperatedByString:@"."];

这将创建一个包含{activity,message,status).

现在您有了可用于查询字典的数组。

[[[myDictionary objectForKey:[array objectAtIndex:0]] objectForKey:[array objectAtIndex:1]] objectForKey:[array objectAtIndex:2]];

这相当于:

[[[myDictionary objectForKey:@"activity"] objectForKey:@"message"] objectForKey:@"status"];

希望这可以帮助 !

于 2012-06-09T16:55:11.037 回答
0

从您的问题中我不清楚我们应该如何映射user1activity.message.status. 现在我假设你的意思是模板可能包含一个字符串"{{activity.message.status}}",你希望能够解析它。

这是一个迭代操作NSMutableString,可以循环直到找不到匹配项:

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\{\\{.+?\\}\\}"
                              options:NSRegularExpressionCaseInsensitive
                              error:&error];
NSRange matchRange = [regex rangeOfFirstMatchInString:string
                      options:0 range:NSMakeRange(0, [string length])];
NSRange keyPathRange = NSMakeRange(matchRange.location + 2, matchRange.length - 4);
NSString *keyPath = [string substringWithRange:keyPathRange];
NSString *newSubstring = [myDictionary valueForKeyPath:keyPath];
[string replaceCharactersInRange:matchRange withString:newSubstring];

我没有测试过这段代码。

于 2012-06-09T17:01:08.307 回答
0

NSMutableDictionary 上的(递归......酷)类别方法怎么样:

- (void)setObject:(id)object forCompoundKey:(NSString *)compoundKey {

    NSArray *keys = [compoundKey componentsSeparatedByString:@"."];

    if ([keys count] == 1) {
        return [self setObject:object forKey:compoundKey];
    }

    // get the first component of the key
    NSString *key = [keys objectAtIndex:0];

    // build the remaining key with the remaining components
    NSRange nextKeyRange;
    nextKeyRange.location = 1;
    nextKeyRange.length = [keys count] - 1;
    NSArray nextKeys = [keys subarrayWithRange:nextRange];
    NSString *nextKey = [nextKeys componentsJoinedByString:@"."];

    NSMutableDictionary *nextDictionary = [NSMutableDictionary dictionary];
    [self addObject:nextDictionary forKey:key];

    // now the cool part... recursion
    [nextDictionary setObject:object forCompoundKey:nextKey];
}

我没有对此进行测试,但它通过了快速桌面检查。objectForCompoundKey: 检索可以类似地编写。

于 2012-06-09T17:17:37.950 回答