2012年12月16日日曜日

NSDictionaryの特定のキーでソートしちゃる

どうも、俺@まだ勉強中です。

例えばNSArray(またはNSMutableArray)内にNSDictionaryが複数入っているとして、そのNSArrayをNSDictionaryのとあるキーでソートしたい場合。

NSArray *array = [NSArray arrayWithObjects:@[
        @{@"id":@100, @"name":@"bob"},
        @{@"id":@14,  @"name":@"ken"},
        @{@"id":@531, @"name":@"john"},
        @{@"id":@32,  @"name":@"mike"},
        @{@"id":@65,  @"name":@"kozy"},
        @{@"id":@174, @"name":@"shorn"},
        @{@"id":@7,   @"name":@"scott"},
        @{@"id":@865, @"name":@"mikeal"},
        @{@"id":@31,  @"name":@"fun"}
    ]];
このarrayを格納しているNSDictionaryのキー:idでソートしちゃりたい!場合は、
// NSSortDescriptorを生成して
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:YES];
// 配列に入れておいて
NSArray *sortarray = [NSArray arrayWithObject:sortDescriptor];
// ソートしちゃる!
NSArray *resultarray = [array sortedArrayUsingDescriptors:sortarray];
// 不要なオブジェクトは解放しちゃる
[sortDescriptor release];
これでキー:idの値でソートされます。


以上でぇぇえぇぇぇえぇす。

Objective-Cの高速列挙は順番保証されない

どうも、俺@勉強中です。

Objective-Cの高速列挙(for ... in ...)は配列全体を走査するのにとても便利なんだけど、取得される順番が保証されません。
# NSDictonaryのキーの順番通りに値を取り出したい!とする。
NSDictionary *dictionary = @{
    @"1": @{@"name":@"bob"},
    @"2": @{@"name":@"ken"},
    @"3": @{@"name":@"john"},
    @"4": @{@"name":@"mike"},
    @"5": @{@"name":@"kozy"},
    @"6": @{@"name":@"shorn"},
    @"7": @{@"name":@"scott"},
    @"8": @{@"name":@"mikeal"},
    @"9": @{@"name":@"fun"}
};

for (id key in dictionary) {
    NSLog(@"%@", key); // 1,2,3,...と出てくれない
}
順番通りに取り出したい時困る。
なので回避策としてNSArray#sortedArrayUsingComparatorを使う方法があります。
// 一旦NSDictionaryのキーを取得して
NSArray *keys = [dictionary allKeys];

// sortedArrayUsingComparatorを使ってキーをソート
keys = [keys sortedArrayUsingComparator:^(id o1, id o2) {
    return [o1 compare:o2];
}];

// 確認すると順番通りそ
NSLog(@"%@", keys);
NSMutableArray *array = [NSMutableArray array];

// あとは順番通りに値を取得する
for (id key in keys) {
    [array addObject:[dictionary objectForKey:key]];
}

// 完璧!
NSLog(@"%@", array);
これで最初のNSDictionaryのキー順番通りに値を取得できます

以上でぇぇえぇぇす。

2012年12月14日金曜日

NSStringのstringWithFormatで小数点以下をええ感じにする

どうも、俺@昼休みです。
 ここ数日はブログへのPOSTが多いですね。開発してると小ネタをよく見つけます。

今日はObjective-CのNSString#stringWithFormatメソッドについてです。
 例えば、100を文字列で表す場合は
[NSString stringWithFormat:@"%d", 100];
ですね。 0.1を表す場合は
[NSString stringWithFormat:@"%.1f", 0.1f];
です。 0.12345の場合は
[NSString stringWithFormat:@"%.5f", 0.12345f];
です。 小数点以下の桁数が決まっている場合は良いのですが、上の0.12345のフォーマットで0.1を表したい場合は、
[NSString stringWithFormat:@"%.5f", 0.1f];
// 結果は0.10000
となってしまいます。 出来れば0.1と表示させたい!という場合に便利なフォーマットは、
[NSString stringWithFormat:@"%g", 0.1f];
// 結果は0.1
[NSString stringWithFormat:@"%g", 0.12345f];
// 結果は0.12345
になります。

 以上でぇぇぇえぇす。

2012年12月13日木曜日

Retinaディスプレイかどうかの判別

どうも、俺@コーディング中です。
ギークな感じでいいでしょう。

Objective-CでRetinaディスプレイかどうかを判別する方法をφ(..)メモメモ。

[UIScreen mainScreen].scale
の値が
1.0なら非Retina
2.0ならRetina
です。

ちなみにOSのバージョンの取得方法は、
[UIDevice currentDevice] systemVersion]
で、
例えば「iOS5.0以上」というような条件分岐をする場合、
float version = [[[UIDevice currentDevice] systemVersion] floatValue];

if (version >= 5.0f) {
  // 5.0以上の処理
}
というように書けます!

以上でぇぇぇぇぇす。

2012年12月12日水曜日

1つの.vimrcにユーザ毎の設定をする

どうも、俺@仕事中です。
今日は.vimrcにログインユーザ別の設定を書く方法をめもめも。
 
あまりないパターンかもしれませんが、 例えばLinux本番サーバの運用方法などで、
 「ログインユーザは各開発者毎に用意されているがソースや設定ファイルの変更は共通のユーザになってからでないと編集したらダメ!」
というようなルールが設定されているような場合、
$ su someuser
とかで共通ユーザになってから作業するのですが、
この時の.vimrcがこの事務所内の誰かが設定した.vimrcだった場合に
「何やこの設定!?」となってしまう事もありえると思います。 
そういう場合は.vimrcにログインユーザ毎の設定を書いちゃえば万事OKです!
if $USER == 'koexuka'
  set enc=utf8
  set fenc=utf8
  set hlsearch
  .
  .
  .
endif
など。
 もちろん $USER を他の環境変数に書き換えて使うこともできちゃいます!

 以上でぇぇぇえぇぇぇす。