2

I'm trying to use CFStringTokenizerCopyBestStringLanguage. The docs say:

The range of string to use for the test. If NULL, the first few hundred characters of the string are examined.

But passing NULL yields an error:

Passing 'void *' to parameter of incompatible type 'CFRange'

What is the correct way of doing this?

NSString *language = (NSString *)CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, NULL));

4

1 に答える 1

2

ドキュメントのエラーのようです。

NULL通常、次のように定義されます

#define NULL ((void*)0)

だからそれはポインタです。

一方、CFRangeは次のように定義されます。

struct CFRange {
   CFIndex location;
   CFIndex length;
};
typedef struct CFRange CFRange;

つまり、構造体、つまり非ポインター型です。

NULLに互換性のない型があるため、構造体を に割り当てることCFRangeはできませんNULL

特定の問題に戻ると、次のようなことをしたいかもしれません

CFStringRef text = //your text
CFRange range = CFRangeMake(0, MIN(400, CFStringGetLength(text)));
NSString *language = (NSString *)CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage(text, range));

ドキュメントに記載されているため、400を選択しました

通常、この関数では、文字列の言語を確実に推測するために 200 ~ 400 文字が必要です。


アップデート

エラーを Apple に報告しました。

于 2013-09-26T21:21:45.607 に答える