NSLog C構造体(CGRectやCGPointなど)は可能ですか?


413

C構造を構成するすべてのプロパティを明示的に入力しなくても、C構造をデバッグできるようにしたいと考えています。

つまり、次のようなことができるようになりたいです。

CGPoint cgPoint = CGPointMake(0,0);
NSLog(@"%@",cgPoint);

明らかに '%@'は機能しないため、質問です。


2
NSLog(@ "%@"、CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi

VTPG_CommonライブラリからLOG_EXPRを試してください:vgable.com/blog/tag/log_expr
LearnCocos2D

回答:


806

あなたはこれを試すことができます:

NSLog(@"%@", NSStringFromCGPoint(cgPoint));

さまざまなCG構造体をに変換するUIKitによって提供される関数いくつかありますNSString。それが機能しない理由%@は、オブジェクトを表すためです。A CGPointはC構造体です(CGRectsとCGSizes も同様です)。


7
OS XのAppKitでは、に変換してNSPointからを呼び出す必要がありますNSStringFromPoint。例えば:NSStringFromPoint(NSPointFromCGPoint(point))
アレックス

19
NSLog(@ "%@"、CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi

UI、MK、CLプレフィックスと同様ですが、これらはすべて意味を持ち、:UIKit、MapKit、CoreLocationなどのそれぞれの.hファイルをインポートする必要があります。CGプレフィックスは何かをインポートする必要があることを意味しますか?そうでない場合は、単なる命名規則ですか?
Honey

231

以下のようないくつかの機能があります。

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

例:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

4
これらは次のとおりです。「iOS開発のすべてにおいて、最も有用であるがあまり知られていない単一のもの」!! へー
ファッティ

7
注:Cocoa(OS X)開発の場合、これらの関数の名前には「CG」が含まれていません。
peterflynn 2015


13

次のマクロを使用して、NSRectを支援します。

#define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
    #RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)

CGPointについても同様のことができます。

@define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
    #POINT POINT.x, POINT.y);

次のように使用します。

LogCGPoint(cgPoint);

以下を生成します:

cgPoint: (100, 200)


今やる。これらはまさに、アレックスとスティーブが回答に投稿した機能です。
e.James、2011年

1
答えを編集して、「歴史的関心のみ...」の上部にメモ追加する価値はありますか?私はいつもそうします。たとえば、stackoverflow.com / questions / 402 / iphone - app - in -landscape - mode /…stackoverflow.com/questions/5492479/…stackoverflow.com/questions/4212628/…"それは注目に値します過去10年間のこの投稿は、本当に歴史的な関心事にすぎません。」)など
Fattie

1
NSStringFromヘルパーを持たない他のフレームワークには他の構造体(MKCoordinateRegionなど)があるため、UIKit変換関数が存在するにもかかわらず、この回答は依然として役に立ちます。
グレッグベル

10

NSValueこれに使用できます。AN NSValueのオブジェクトは、単一のCまたはObjective-Cのデータ項目の単純なコンテナです。ポインター、構造体、オブジェクトIDだけでなく、int、float、charなどの任意のスカラー型を保持できます。

例:

  CGPoint cgPoint = CGPointMake(10,30);
    NSLog(@"%@",[NSValue valueWithCGPoint:cgPoint]);

出力: NSPoint: {10, 30}

お役に立てば幸いです。


@Nishantに感謝-CMTimeRangeのコンテンツを出力する必要があり、これでうまくいきました。NSStringFromよりはるかに多くの可能性...
amergin

5

Stack Overflowの壊れたRSSがこの質問を復活させたばかりなので、これが私のほぼ一般的な解決策です:JAValueToString

これによりJA_DUMP(cgPoint)cgPoint = {0, 0}ログに記録して取得できます。


私はそれを行い、コンパイルエラーが発生しました。プロパティ表現のアドレスが必要な場合があります
user4951

@ジム・ティオ:マクロは、検査されるオブジェクトが左辺値でなければならないように設定されています。(理由を思い出せません。それ以外の方法でC文字列を適切に処理できないことについてです。)つまり、一時変数にプロパティを割り当て、その上でJA_DUMPを呼び出します。
Jens Ayton

5

はい、次のようないくつかの関数を使用できます。最初に、CGPoint構造体を文字列に変換する必要があります。例を参照してください

1) NSStringFromCGPoint,  
2) NSStringFromCGSize,  
3) NSStringFromCGRect,  
4) NSStringFromCGAffineTransform,  
5) NSStringFromUIEdgeInsets,

例えば:

1) NSLog(@"NSStringFromCGPoint = %@", NSStringFromCGRect(cgPointValue));

このような...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.