美文网首页iOS精品文章iOS程序员
iOS开发 - protocol中定义属性?

iOS开发 - protocol中定义属性?

作者: 不上火喝纯净水 | 来源:发表于2017-03-07 22:17 被阅读2025次

    在iOS的面试中经常会被问到如何为分类添加属性,但是鲜少听人提过协议中添加属性的情况。
    我们知道协议是一组特定功能或者行为的规范,这个概念和C#或者Java中的接口是一样的,但是C#或者Java中的接口类中都可以定义属性的,那么在OC的协议中定义属性可不可以呢

    很简单你试一下就知道是可以的,但网上查阅很多资料的时候你会发现很多地方根本没有提起过协议中定义属性,甚至有直接说协议中不能定义属性的。


    我们来试一下:

    未实现警告
    当我们在协议中定义一个必须实现(@ required修饰)的属性以后,如果实现类没有对这个属性做任何实现那么XCode中实现类中就会发出警告

    方式一:在.m实现类中添加@synthesize speed;

    @protocol FlyDelegate <NSObject>
    
    @required
    @property(nonatomic, assign) NSUInteger speed;
    
    @end
    
    @interface TestProtocolProperty : NSObject<FlyDelegate>
    
    @end
    
    @implementation TestProtocolProperty
    
    @synthesize speed;
    
    - (instancetype)init {
        if (self = [super init]) {
            
        }
        return self;
    }
    
    @end
    

    方式二:在.m实现文件中添加合成speed属性的成员变量_speed和对应的getter和setter方法

    @protocol FlyDelegate <NSObject>
    
    @required
    @property(nonatomic, assign) NSUInteger speed;
    
    @end
    
    @interface TestProtocolProperty : NSObject<FlyDelegate> {
        NSUInteger _speed;
    }
    @end
    
    @implementation TestProtocolProperty
    
    - (instancetype)init {
        if (self = [super init]) {
            
        }
        return self;
    }
    
    - (void)setSpeed:(NSUInteger)speed {
        _speed = speed;
    }
    
    - (NSUInteger)speed {
        return _speed;
    }
    
    @end
    

    结论:OC语言的协议里面是支持定义属性的,而在协议中定义属性其实和在其中定义方法一样只是定义了getter和setter方法,并没有具体实现,所以当这个协议属性修饰符为@ required时,如果不实现编译器就会报出警告,最简单的方式就是加上属性同步语句@synthesize propertyName;

    思考:属性和方法其实都是一个事物的特性,协议正是描述某类行为和特性的一种规范,基于这个事实,所以在协议中定义属性是很符合道理的。之所以在iOS开发中很少看到有人这么使用过是因为,iOS开发中协议通常是被用作代理模式而存在的,并且如果在协议中定义了是属性,就必须在实现类中添加对属性自动同步或者手动添加属性实现代码

    (本文中讨论的协议中属性这个话题本身是没什么技术深度,但是却可以打开思维的广度)

    相关文章

      网友评论

      • liki:我也是看到苹果官方代码,才推翻【协议中不能定义属性的】设定;“协议中不能定于属性”,应该更改为“针对协议本身而言,是否定义属性要看它本身的特性”
        swiftly_zhou:正如作者说的,协议中定义属性,其底层是被编译器自动生成了getter、setter的方法声明,而忽略相应名称成员变量的定义。要想使用正常,在遵守协议的类中需要自己手动实现方法,或者添加@synthesize编译器声明。如此而已。
        RBNote:赶巧了,今天看到官方API 有这种写法。
        UIViewControllerContextTransitioning 这玩意是用来做过渡动画的。它是一个协议,有定义自己的属性、方法。
        有兴趣的可以点击进去看看。
        热血足球2016:。。。你这样会让人懵逼的

      本文标题:iOS开发 - protocol中定义属性?

      本文链接:https://www.haomeiwen.com/subject/xsbegttx.html