如何从Cocoa中的CFStringTokenizer获取令牌类型?

时间:2009-05-08 23:12:19

标签: objective-c cocoa string core-foundation

CFStringTokenizer文档在CFStringTokenizerAdvanceToNextToken()中有两个冲突的语句:

  

CFStringTokenizerAdvanceToNextToken

     

...

     

返回值

     

如果标记生成器成功找到标记并将其设置为当前标记,则标记的类型。如果tokenizer无法找到令牌,则返回kCFStringTokenizerTokenNone。有关可能的值,请参阅“令牌类型”。

     

...

     

如果找到令牌,则将其设置为当前令牌,该函数返回true;否则当前令牌无效,函数返回false。

第一段(返回令牌类型)是我想看到的:例如,它可以让您检查令牌是否完全由非字母数字字符组成。但是,第二段(返回true或false)似乎是实际发生的事情。

为什么会出现这种想法,或者如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

标题注释没有提到返回true或false,当标题和在线文档不同意时,它通常是正确的标题。

在一个简单的测试中,我能够获得0和1以外的返回值,因此您看到的问题可能更具体;你能发布失败的示例代码吗?

答案 1 :(得分:0)

在更广泛的“非零”和“零”意义上,它们可能意味着“真实”和“虚假”。如果找到一个令牌,则该函数返回kCFStringTokenizerTokenNormal(即1)或某些掩码的组合(无论是哪种方式,非零/“真”)。如果没有,则函数返回kCFStringTokenizerTokenNone(为零/“假”)。

这当然是模糊的语言,所以请在Apple Bug Reporter上提交文档错误。

答案 2 :(得分:0)

如果您正在寻找的是忽略CFNumber类型令牌的能力,那么您可以使用:

while (tokenType != kCFStringTokenizerTokenNone) {
    if ( (tokenType & kCFStringTokenizerTokenHasHasNumbersMask) == 0) { // ignore numbers
        range = CFStringTokenizerGetCurrentTokenRange(tokenizer);
        NSString *token = [string substringWithRange:NSMakeRange(range.location, range.length)];
        [tokensArray addObject:token];
    }
    tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer);
}