2

悪いスタイルと見なされることを 2 つ実行しますが、理由があり、Cocoa ソリューションを受け入れています。それが何であるかはわかりません。

NSArraya に対してタイプ セーフな が必要で、UIView次にs のNSArray配列に対してタイプ セーフな が必要UIViewです。の 2D 配列UIViews

UITableView垂直テーブル ビュー内にネストされた水平テーブル ビューを持つカスタム double を実装したので、これが必要です。私は自分のカスタムViewsArrayViews2DArray、他のプログラマーが簡単に私の にコンテンツを与えるデータ構造として使用しますDoubleTableView。それは延長したい十分な理由NSArrayですか?

私が抱えている問題は、メソッドの機能をオーバーライドしたことです。

(NSArray *) initWithObjects:(id) firstObject ...なので:

(ViewsArray *) initWithViews: (UIView *) firstView, ...

しかし、 my メソッドの戻り値は であり、 myNSArrayに他のメソッドが含まれていませんViewsArray。これは、認識されていない選択された例外を意味します。ビューを含むNSArrayプロパティを作成することでこれを一時的に解決しましたが、コンテンツを.ViewsArrayDoubleTableView

元:

[[self.delegate content].arraysOfViews objectAtIndex:indexPath.section];

それ以外の

[[self.delegate content] objectAtIndex:indexPath.section];

数文字であることはわかっていますが、良いコードを書くために最善を尽くしています。

selfに戻り、、などのプロパティを追加するにはinitWithViewsどうすればよいですか? (キャスティング?) 私はこれについて間違っていると考えていますか (Java/typesafity で ...)? このようなデータ構造に最適なソリューションは何ですか?NSArraygreatestHeighttotalWidth

編集:

「スタイリッシュ」と思われる方法で問題を解決するために、次のことを行いました。

これは私のヘッダーです (これは NSObject であることに注意してください):

@interface ViewsArray : NSObject

@property int greatestHeight;
@property int greatestWidth;
@property int totalWidth;

- (ViewsArray *) initWithViews: (UIView *) firstView, ...;
- (UIView *) getViewAtIndex: (NSInteger) index;
- (NSUInteger) viewCount;

@end

これは私の実装です:

@interface ViewsArray ()

@property (retain, nonatomic) NSArray *views;

@end

つまり、プライベート NSArray を管理するだけです。きれいな参照を許可します。

今日私が学んだこと: いまいましいドキュメントを読んで、自分の言語を受け入れてください。このインスタンスが最後のものを示していない可能性があることはわかっていますが、より近いです;)

4

1 に答える 1

5

簡単な解決策; 気にしないでください

NSArray / NSDictionary APIを使用してObjective-Cアプリを18年間使用およびデバッグしているときに、コレクション内の間違ったクラスの問題に遭遇したのは数回だけだと思います。すべての場合において、プログラム上のエラーではなく、包括的な設計上の問題を示していました。

簡単に言えば、アプリはコレクションのコンテンツを制御し、コレクションに間違ったものを貼り付けない限り、コレクションには期待どおりの内容が含まれます。適切に作成されたアプリケーションでは、コレクションに何かを追加する可能性のある場所の数は非常に少なく、通常は1つまたは2つの場所にすぎません。

これに対して防御する必要があると感じた場合はNSAssert([... isKindOfClass:...])、アレイに何かを追加する1つまたは2つの場所にを追加してください。検索のポイントで同じものを追加する必要はありません。

ただし、コレクション内のタイプが正しくないように見える一般的な誤検知の失敗モードがあります。オブジェクトをオーバーリリースし、他のクラスのオブジェクトがたまたま同じ場所に割り当てられている場合、このモードの失敗が表示されます。

于 2012-08-02T13:56:14.357 に答える