如何强制数组对象符合特定协议?

Sir*_*III 5 protocols objective-c nsarray ios

我想允许不同观点之间的沟通.

我有两个较小的视图,位于更大的视图之上,类似于iOS的视频播放器,但有一些差异.当我点击较大的视图时,我想要切换视图外观,隐藏或取消隐藏.我有一个所有视图都符合的协议.我想将视图添加到我将调用的另一个类中,该类HideViewsService具有NSArray属性.我可以强制使用此类的HideViewsService类,并添加视图,以仅添加符合此协议的视图吗?甚至只是UIViews

另外,我想在我知道所有的视图上调用一个方法,但我不知道如何通过编译器获取.这是我的-hideAllViews方法:

-(void)hideAllViews
{
for(int i=0; i<self.viewArray.count; i++)
{
    id obj = [self.viewArray objectAtIndex:i];
    if([obj isKindOfClass:[UIView class]] == false)
    {
        return;
    }
    UIView *view = (UIView *)obj;
    if([view respondsToSelector:@selector(hide)])
    {
        [view hide]; // the compiler obviously doesn't like this
    }
}
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!我还在学习,所以请告诉我是否有更好的方法(不仅更容易,而且更好).

Rob*_*ier 5

ObjC没有泛型.如果有的话,有时会很好,但事实并非如此.但是上面的设计有几个问题.

首先,如果viewArray应该只包含UIView对象,那么它包含其他任何内容都是一个编程错误.这是不正常,只是return如果你发现事实并非如此.如果你要在这里检查一下,它应该是NSAssert().同样,如果所有内容都viewArray应该响应hide,那么你不应该跳过它,如果没有的话.这是许多微妙错误的根源.

更好的解决方案是在添加对象时控制对象的添加HideViewsService(尽管有更好的方法可以做到这一点;我们将会这样做).

@protocol XYZHideableView <NSObject>
- (void)hide;
@end

@interface XYZHideViewsService
- (void)addHideableView:(id<XYZHideableView>)view;
- (void)removeHideableView:(id<XYZHideableView>)view;
@end
Run Code Online (Sandbox Code Playgroud)

现在,您不必担心是否viewArray包含响应的内容hide.

也就是说,我通常会这样做NSNotificationCenter.可隐藏的视图应该观察到类似的通知XYZHideAllHideableViews.当他们设置它时,他们应该隐藏自己.那你就不需要了HideViewsService.你只需要一个+[HideableView hideAllHideableViews]类方法.