0

私はenumerateLinguisticTagsInRange次のようなメソッド内で使用しています:

[nonAttributedString enumerateLinguisticTagsInRange:stringRange
                                           scheme:NSLinguisticTagSchemeTokenType
                                          options:NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames
                                      orthography:[NSOrthography orthographyWithDominantScript:@"Latn" languageMap:languageMap]
                                       usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {

       // If the token is a word...
       if ([tag isEqualToString:@"Word"])
       {
           // (And add to the tracking dictionary)
           NSMutableDictionary *wordAndRange = [[NSMutableDictionary alloc] init];
           [wordAndRange setObject:[NSNumber numberWithInt:(tokenRange.location + tokenRange.length)] forKey:[nonAttributedString substringWithRange:tokenRange]];

           [typedWordsAndRanges addObject:wordAndRange];
       }
   }];

タガーは正常に動作していますが、範囲を に制限していませんstringRangenonAttributedString全体を列挙しています。

このブロックのすぐ上に次のログを含めると:

 NSLog(@"########### stringRange.location = %d", stringRange.location);
 NSLog(@"########### stringRange.length = %d", stringRange.length);
 NSLog(@"########### substring = %@", [nonAttributedString substringWithRange:stringRange]);

次の出力が得られます。

2013-03-18 21:06:27.744 WEJ[13231:c07] ########### stringRange.location = 10
2013-03-18 21:06:27.745 WEJ[13231:c07] ########### stringRange.length = 4
2013-03-18 21:06:27.805 WEJ[13231:c07] ########### substring =  de 

そうstringRangeです。nonAttributedStringただし、それはまだ全体を列挙しています。

私は何を間違っていますか?

4

1 に答える 1

0

状態のドキュメントenumerateTagsInRange:scheme:options:usingBlock::

このメソッドは、指定された範囲と交差するすべてのトークンの範囲を返すことに注意してください。

に完全に含まれるトークンのみを考慮したい場合は、 を呼び出す前にstringRangeその部分文字列を取得する必要があります。nonAttributedStringenumerateTagsInRange::::

于 2013-03-19T17:01:46.313 に答える