5
クラスのサブビュー内のすべてのUIViewを反復処理し、isKindOfClass
を使用してループのタイプをチェックすると、自分のコードが冗長に見えます。だから私は各サブビューのブロックを実行する以下のメソッドを書いた。特定のタイプのすべてのサブビューを繰り返します。
@implementation Util
+ (void)iterateOverSubviewsOfType:(Class)viewType
view:(UIView*)view
blockToExecute:(void (^)(id subview))block
{
for (UIView* subview in view.subviews) {
if ([subview isKindOfClass:viewType]) {
block(subview);
}
}
}
@end
このメソッドに渡されたブロックは、タイプid
の引数を取ります。ここで使用される型はもちろん、最初の引数として渡される型と同じでなければなりません。しかし、これまでのところ、私はより多くの型を安全にする方法を考え出していません。
isKindOfClassではなくisMemberOfClassを使用することに同意します。しかし、私が指摘していた問題は、どのタイプの引数も取るブロックを渡すことができるということです。引数は、種類がUIViewであるか、そこから派生している必要があります。具体的には、メソッドに渡されるviewTypeと同じクラスでなければなりません。 – Nils
それからブロックするためにクラスを渡し、ブロック内のクラスの安全性をチェックする必要があります。もう1つの方法は、あなたのブロック引数に 'typeof(class)subview'を使うことですが、それはあなたのメソッドをいくつかの外部変数に依存させます。 –
それは非常に優雅に聞こえません。上記の方法で何も変更しないでしょうか? – Nils