ページ

2010年2月28日日曜日

今週のCocoa情報(2/28) - 今週気になった Cocoaプログラミング情報の紹介

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

KVC の valueForKey: と mutableArrayValueForKey: の違いは?
key-value coding and to-many relationships - Stack Overflow

返ってくるクラスが異なる。以下、引用。

NSLog(@"%@", [self.array class]);
NSLog(@"%@", [[self valueForKey:@"array"] class]);
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]);
This prints:
2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray
mutableArrayValueForkey: で戻ってくる配列は proxy 動作をする、らしい。
proxy 動作の性質により、条件を満たせば配列自体が存在しなくてもいい(ってわかりにくいな)。

同様の質問が別途上がっていた。


以下、関連

Mac Dev Center: NSKeyValueCoding Protocol Reference



理解がいまいち。少し手を動かさないと駄目だ。。後日取り上げたい。


2つの文字列の一致度を計るには?
Best practice for determining the probability that 2 strings match - Stack Overflow
Levenshtein distance (レーベンシュタイン距離)が紹介されていた。
レーベンシュタイン距離 - Wikipedia

以下、Wikipedia から引用。
レーベンシュタイン距離(レーベンシュタインきょり)あるいは編集距離(へんしゅうきょり)は、情報理論において、二つの文字列がどの程度異なっているかを示す数値である。具体的には、文字の挿入や削除、置換によって、一つの文字列を別の文字列に変形するのに必要な手順の最小回数として与えられる。
スペルチェッカーなどで活用されている他、DNA配列同士の類似性を判断するのにも応用されているとのこと。

実際的な距離の求め方を例示すれば、“kitten”を“sitting”に変形する場合には、以下に示すように最低でも 3 回の手順が必要とされるので、2単語間のレーベンシュタイン距離は 3 となる。
  1. kitten
  2. sitten (“k”を“s”に置換)
  3. sittin (“e”を“i”に置換)
  4. sitting (“g”を挿入して終了)
上の変形では挿入・削除・置換のそれぞれのコストを1に設定したが、これらのコストには別々の値を割り振る事も可能である。例を挙げれば、挿入・削除のみを許可し、置換を禁止するタイプのレーベンシュタイン距離は、挿入・削除にコスト1、置換にコスト2が割り振られるレーベンシュタイン距離と等価である。この場合、“kitten”と“sitting”の間のレーベンシュタイン距離は5となる

カスタムオブジェクトを NSUserDefaults へ格納するには?
How to store custom objects in NSUserDefaults - Stack Overflow

クラスに encodeWithCorder: と initWithCorder: を実装し、+[NSKeyedArchiver archivedDataWithRootObject:] と +[NSKeyedUnarchiver unarchiveObjectWithData:] を使う。以下引用。



- (void)encodeWithCoder:(NSCoder *)encoder{
       //Encode properties, other class variables, etc
    [encoder encodeObject:self.question forKey:@"question"];
    [encoder encodeObject:self.categoryName forKey:@"category"];
    [encoder encodeObject:self.subCategoryName forKey:@"subcategory"];
}
- (id)initWithCoder:(NSCoder *)decoder{
    self = [super init];
    if( self != nil )
    {
               //decode properties, other class vars
        self.question = [decoder decodeObjectForKey:@"question"];
        self.categoryName = [decoder decodeObjectForKey:@"category"];
        self.subCategoryName = [decoder decodeObjectForKey:@"subcategory"];
    }
    return self;
}
Reading and writing from NSUserDefaults:
-(void)saveCustomObject:(MyCustomObject*)obj{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj];


    [defaults setObject:myEncodedObject forKey:@"myEncodedObjectKey"];
}
-(MyCustomObject*)loadCustomObjectWithKey:(NSString*)key{
    NSUserDefaults defaults = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [defaults objectForKey: key];
    MyCustomObject* obj = (MyCustomObject*)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
    return obj;
}


Snow Leopard で Core Location Framework が使える
MOONGIFT: » Snow Leopard向け。位置情報取得デモ「whereami」:オープンソースを毎日紹介

これは知らなかった。
探してみると確かに Mac 用のマニュアルにのっている。
Mac Dev Center: Core Location Framework Reference

ほう。