1

NSArray の -description メソッドは、次のように再帰呼び出しをネストします。

2009-05-15 14:28:09.998 TestGUIProject[29695:813] (
    a, // Array1 item 1
        ( // Array2, a second array, nicely indented another 4 spaces
        a // Item in Array2
    ) // End of Array2
) // End of Array1

私は自分のカスタムクラスに似たようなことをしたいと思っています(私が書いているスクリプトを使用して)。

私が知らないのは、再帰的に呼び出されたオブジェクトが独自の新しい行を追加するときに、余分なレベルのインデントを追加する方法です。

私が持っているものは次のとおりです。

- (NSString *)description {
    return [NSString stringWithFormat:@"{{{\n"
            @"    prop1: %@\n"
            @"    prop2: %@\n"
            @"    prop3: %@\n"
            @"    prop4: %@\n"
            @"}}}",
            self.prop1,
            self.prop2,
            self.prop3,
            self.prop4];
}

しかし、これは、プロパティの 1 つが NSArray であるか、この同じ記述形式を使用する別のオブジェクトであるとすぐに破綻します。うまく入れ子にならないからです。

代わりに次のようになります。

2009-05-15 14:25:50.899 TestApp[29636:813] {{{
    prop1: SomeValue1
    prop2: ( // Prop 2 is an Array of strings
    "String1", // Note no additional level of indentation as in the NSArray example
    "String2",
    "String3",
    "String4"
)
    prop3: SomeValue3
    prop4: SomeValue4
}}}

ネストの追加レベルを取得するにはどうすればよいですか?

4

3 に答える 3

8

必要なのは、NSArray と NSDictionary で利用できるこの関数です。

- (NSString *) descriptionWithLocale: (id) locale indent: (NSUInteger) level;

ネストされた配列またはディクショナリが出力するすべてのものを指定された量だけインデントするようにするには、1 のインデントを指定します。

于 2009-05-15T22:59:32.413 に答える
1

これは実際に私の目的のために機能します:

[[self.prop2 description] stringByReplacingOccurrencesOfString:@"\n" withString:@"\n    "]
于 2009-05-15T22:24:18.333 に答える
0

descriptionin に依存することをやめなければならない場合がありますNSArray。おそらく、配列を反復処理し、必要に応じて自分でインデントするメソッドを作成して、NSString. NSMutableString文字列を追加できるように、おそらく an を使用して渡す必要があります。

編集

objc_*あなたのコメントに基づいて、メソッドを使用して、デバッグメソッドに渡されたオブジェクトを反映するように言います。そこから、すべてのプロパティまたはインスタンス変数を取得して、それらを反復処理できます。条件付きを使用して ivar のタイプをチェックすることもできます。それがNSArrayorなどの標準コレクション クラスである場合NSDictionaryは、自分で反復処理して、必要な形式でデータを出力します (もちろん、他のタイプのオブジェクトとすべてを処理します)。プリミティブを独自の方法で)。

于 2009-05-15T21:49:01.663 に答える