Swift中的访问控制和protected

 更新时间:2015年05月25日 11:27:30   投稿:junjie  
这篇文章主要介绍了Swift中的访问控制和protected,本文主要讲解为什么Swift没有类似protected的选项,需要的朋友可以参考下

原文再续,书折第一回。

很多其他编程语言都有一种”protected“设定,可以限制某些类方法只能被它的子类所使用。

Swift支持了访问控制后,大家给我们的反馈都很不错。而有的开发者问我们:“为什么Swift没有类似protected的选项?”

当我们在设计Swift访问控制的不同等级时,我们认为有两种主要场景:

●在一个APP里:隐藏某个类的私密细节。
●在一个开源框架里:不让导入这个框架的APP,随便接触框架的内部实现细节。

上面的两种常见情况,对应着private和internal这两个等级。

而protected相当于把访问控制和继承特性混在一起,把访问控制的等级设定增加了一个维度,使之复杂化。即使设定了protected,子类还是可以通过新的公开方法、新的属性来接触到所谓“protected”了的API。另一方面,我们可以在各种地方重写一个方法,所谓的保护却没有提供优化机制。这种设定往往在做不必要的限制 一 protected允许了子类,但又禁止所有其他别的类(包括那些帮助子类实现某些功能的类)接触父类的成员。

有的开发者指出,apple的框架有时候也会把给子类用的API分隔出来。这时候protected不就有用了吗?我们研究后发现,这些方法一般属于下面两种情况:一是这些方法对子类以外的类没啥用,所以不需要严格保护(例如上面说的协助实现某些功能的类)。二是这些方法就是设计出来被重写,而不是直接用的。举个例子,drawRect(_:)就是在UIKit基础上使用的方法,但它不能在UIKit以外应用。

除此之外,如果有了protected,它要怎么样和extension相互作用呢?一个类的extension能接触它的protected成员吗?一个子类的extension可以接触父类的protected成员吗?extension声明的位置对访问控制等级有没有影响呢?(复杂到要哭了是不是?)

对访问控制的设计,也依循了Objective-C开发者(包括apple内外的)的常规做法。Objective-C方法和属性一般在.h头文件里声明,但也可以写在.m实现文件里。假如有一个公开的类,想把里面某些部分设为只有框架内可以获取时,开发者一般会创建另一个头文件给内部使用。以上三种访问级别,就对应了Swift里面的public,private和internal。

Swift的访问控制等级和继承无关,是单维度、非常清楚明了的。我们认为这样的模式更简洁,同时满足了最主要的需求:将一个类、或一个框架的实现细节隔离保护起来。这可能和你以前用过的不同,但我们鼓励你试试看。

相关文章

  • Swift 指针底层探索分析

    Swift 指针底层探索分析

    这篇文章主要为大家介绍了Swift 指针底层探索分析,主要包括指针的基本使用,以及指针的内存绑定进行详细分析,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Swift中初始化init的方法小结

    Swift中初始化init的方法小结

    Swift有着超级严格的初始化方法,不仅强化了designated初始化方法的地位,所有不加修饰的init方法都需要在方法中确保非Optional的实例变量被赋值初始化,下面这篇文章主要给大家介绍了关于Swift中初始化init的相关资料,需要的朋友可以参考下。
    2018-04-04
  • Swift如何优雅的进行解包

    Swift如何优雅的进行解包

    这篇文章主要介绍了Swift优雅的进行解包,对swift感兴趣的同学,可以参考下
    2021-04-04
  • Swift初始化方法的使用介绍

    Swift初始化方法的使用介绍

    Swift有着超级严格的初始化方法,不仅强化了designated初始化方法的地位,所有不加修饰的init方法都需要在方法中确保非Optional的实例变量被赋值初始化,下面这篇文章主要给大家介绍了关于Swift中初始化init的相关资料,需要的朋友可以参考下。
    2022-08-08
  • 详解Swift中的Characters字符类型与String字符串类型

    详解Swift中的Characters字符类型与String字符串类型

    Swift中的字符串操作相当便捷,下面我们来详解Swift中的Characters字符类型与String字符串类型,需要的朋友可以参考下
    2016-06-06
  • Swift中风味各异的类型擦除实例详解

    Swift中风味各异的类型擦除实例详解

    你也许曾听过类型擦除,甚至也使用过标准库提供的类型擦除类型如 AnySequence,下面这篇文章主要给大家介绍了关于Swift中风味各异的类型擦除的相关资料,需要的朋友可以参考下
    2022-04-04
  • Combine中错误处理和Scheduler使用详解

    Combine中错误处理和Scheduler使用详解

    这篇文章主要为大家介绍了Combine中错误处理和Scheduler使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Swift如何为网页承载页面添加更多功能详解

    Swift如何为网页承载页面添加更多功能详解

    这篇文章主要给大家介绍了关于Swift如何为网页承载页面添加更多功能的相关资料,包括添加菊花加载的效果、添加跳转到Safari的功能、添加复制链接的功能以及添加分享网页的功能,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • Swift利用CoreData如何存储多种数据类的通讯录

    Swift利用CoreData如何存储多种数据类的通讯录

    这篇文章主要给大家介绍了关于Swift利用CoreData如何存储多种数据类的通讯录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
    2017-12-12
  • Swift无限循环控件开发

    Swift无限循环控件开发

    这篇文章主要为大家详细介绍了Swift无限循环控件开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论