タグ別アーカイブ: NSLog

[C#][ObjC]列挙子

Enumerator=調査員。なんだか不穏な感じ。納税状態とかチェックされちゃいそう。
ちゃんと調べてみます。

C#だと

列挙子はGetEnumeratorメソッドを持っていればforeachで使うコレクションにできるIEnumeratorを取得できる。
このメソッドを持ってる=IEnumerableってこと。

IEnumeratorを実装しないとforeach文で列挙できない。
というか、IEnumeratorはforeachの為にある。かのようにMSDNには記述されている。

IEnumerable.GetEnumerator

http://msdn.microsoft.com/ja-jp/library/system.collections.ienumerable.getenumerator(v=vs.80).aspx

IEnumeratorの最初の位置、Reset直後はundefinedが入ってる。というかC#だと何も入ってない?
いずれにせよ最初に動作させるにはMoveNext()を一発かませとな。
コレクションの要素が変更追加削除されると無効になり、これは回復不能。
コレクションの全ての処理が終わるまでロックすることが推奨される。

以上、MSDNより。

ロックってどうやんの?

Unityだと

内容は以下のリンクのp55。
http://www.slideshare.net/lucifuges/unityc
つまり、MoveNextメソッド内の処理に、yield が挟まる間隔単位でcaseが設けられたswitch構文入りの処理をメンバに持つクラスが生成されるとのこと。
newされる度にクラス変数がカウントアップし、返す内容がシフトする仕組み。

Objective-Cだと

http://www.atmarkit.co.jp/fcoding/articles/objc/05/objc05d.html

NSEnumeratorクラス。

NSArrayやNSDictionaryクラス(これを継承したNSMutable**も?)列挙子を内包しているので、for-in使える。

Objective-Cでの使い方

.MoveNextにあたるのが nextObject。
取得する要素が無いとnilを返す。

for( id obj in array )
{
     NSLog( @"value : %@" , obj );
}
for (id key in dic)
{
     NSLog( @"key : %@ nvalue : %@n", key , [dic objectForKey:key] );
}

列挙子の取得から列挙。

NSEnumerator *en = [dic objectEnumerator];
for ( id obj in en)
{
     NSLog( @"value : %@n ", obj );
}

これで中身をズラズラっと取得。

NSDictionaryはkeyの列挙できるkeyEnumeratorがある。

NSEnumerator *en = [dic keyEnumerator];
id key;
while (key = [en nextObject]) {
     NSLog(@"key: %@, value: %@n", key, [dic objectForKey:key]);
}

サンプル

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    NSLog(@"ApplicationStart");
    
    NSLog(@"NSArray");
    NSArray *arr = [NSArray arrayWithObjects:@"arr0",@"arr1",@"arr2",@"arr3",nil];
    for(id obj in arr)
    {
        NSLog(@"value:%@",obj);
    }
    
    NSLog(@"NSDictionary");
    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                         @"value1",@"key1",
                         @"value2",@"key2", nil];
    for(id key in dic)
    {
        NSLog(@"key:%@, value:%@",key,[dic objectForKey:key]);
    }
    
    NSEnumerator *en = [dic keyEnumerator];
    id key;
    while(key = [en nextObject])
    {
        NSLog(@"en::key:%@, valu:%@",key,[dic objectForKey:key]);
    }
}

Format string is not a string literal

警告!な写真
NSLogの引数にNSStringのメッセージ文を直接書いていたらなぜかワーニング“Format string is not a string literal”が出て気持ち悪いので調べてみたらあっさり。

NSLog([NSString stringWithFormat:@"Milk"]);

これだとWarningがでます。

調べたら…

グーグル先生に訪ねたらこんな回答が。
http://stackoverflow.com/questions/5428325/issue-with-code-format-string-is-not-a-string-literal


NSLog(@"%@",[NSString stringWithFormat:@"%@", entered]);

教えてくれた人曰く、セキュリティを破る事に成りかねないYOとの事。

内容があまりにも簡単過ぎるからだとは思うのだけど、日本後でこういったエラーメッセージに対応してる記事をあまりみない。英語力が解決力に通じてると実感。