CocoaでTxを使うためのObjective-Cラッパーを作りました。
tx-objc-wrapper
iPhone/iPod touch/iPadで大量の文字列を検出したり置換したりするのに使えます。
使い方
- ソースをダウンロード
git clone http://github.com/yatsu/tx-objc-wrapper.git - Txディレクトリ以下のファイルをXcodeプロジェクトに追加
- "Txo.h"をimport
- Txoのメソッドを呼び出す
構築/読み込み
// NSStringが入ったNSSetからTxを構築し、ファイルに保存する + (Txo *)build:(NSSet *)wordSet withFileName:(NSString *)fileName; // Txをファイルから読み込む + (Txo *)read:(NSString *)fileName;
Txの単純なラッパー
- (NSUInteger)prefixSearch:(const char *)aString
length:(NSInteger)length
resultLength:(NSInteger *)resultLength;
- (NSUInteger)commonPrefixSearch:(const char *)aString
length:(NSInteger)length
strings:(NSArray **)strings
txIds:(NSArray **)txIds
limit:(NSUInteger)limit;
- (NSUInteger)predictiveSearch:(const char *)aString
length:(NSInteger)length
strings:(NSArray **)strings
txIds:(NSArray **)txIds
limit:(NSUInteger)limit;
- (NSString *)resultLog;
- (NSString *)errorLog;
- (NSUInteger)keyNum;
Txo独自メソッド
以下のものはtx-rubyをマネして作りました。こちらのメソッドを呼びだすと便利でしょう。
- (NSInteger)longestPrefix:(NSString *)aString fromPosition:(NSInteger)position; - (NSInteger)longestPrefix:(NSString *)aString; - (NSArray *)searchPrefixes:(NSString *)aString forPosition:(NSInteger)position; - (NSArray *)searchPrefixes:(NSString *)aString; - (NSArray *)searchExpansions:(NSString *)aString forPosition:(NSInteger)position; - (NSArray *)searchExpansions:(NSString *)aString; - (void)scan:(NSString *)aString; - (NSString *)replace:(NSString *)aString;
サンプルコード
tx-rubyのサンプルコードと同じことをしてみます。
Tx構築
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *txPath = [NSString stringWithFormat:@"%@/%@", documentsDirectory, @"keywords.tx"]; NSMutableSet *wordSet = [[NSMutableSet alloc] init]; [wordSet addObject:@"foo"]; [wordSet addObject:@"ho"]; [wordSet addObject:@"hog"]; [wordSet addObject:@"hoga"]; [wordSet addObject:@"hoge"]; [wordSet addObject:@"hogeshi"]; Txo *txo = [Txo build:wordSet withFileName:txPath];
文字列検索
[txo longestPrefix:@"hogeeee"] // => 4 (which means "hoge" is in the index) [txo searchPrefixes:@"hoge"] // => (ho, hog, hoge) [txo searchExpansions:@"hog"] // => (hog, hoga, hoge, hogeshi)
部分文字列検索(scan)
TxoDelegateプロトコルの
txo:scannedString:atPosition:を実装します。- (void)txo:(Txo *)aTxo scannedString:(NSString *)aString atPosition:(NSInteger)position {
// 文字列と位置を含む配列をarrayに追加
// (arrayはNSMutableArrayとしてクラスに定義しておく)
[array addObject:[NSArray arrayWithObjects:aString,
[NSNumber numberWithInt:position], nil]];
}
scanを実行。array = [[NSMutableArray alloc] init]; [txo scan:@"hogefugafoo"]; // => ((hoge, 0), (foo, 8))
部分文字列置換(replace)
TxoDelegateプロトコルの
txo:replace:を実装します。- (NSString *)txo:(Txo *)aTxo replace:(NSString *)aString {
return [aString uppercaseString]; // 大文字にして返す
}
replaceを実行。[txo replace:@"hogefugafoo"] // => HOGEfugaFOO
以上のサンプルコードはIPhoneSimpleDemoというサンプルアプリに実装しているので、Xcodeでビルドしてお試しください。
実行すると以下のようになります。
C++ライブラリをObjective-Cでラップする方法は、Objective-C Wrappers for C++ Classes を参考にしました。
今後の予定
- NSDictionary互換インターフェース
- テストコードを書く
- UTF8以外の文字コードに対応
- ラッパーコードの効率的でないところを書き直し

0 Response to "CocoaでTxを使うためのObjcラッパー tx-objc-wrapper"
コメントを投稿