美文网首页
Swift扩展&协议&访问控制

Swift扩展&协议&访问控制

作者: woniu | 来源:发表于2019-12-10 17:54 被阅读0次

    一、扩展

    1、扩展简介:

    Swift中的扩展,类似于OC中的分类(Category)。

    2、扩展可以为枚举、结构体、类、协议添加新功能。

    a.可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等。

    3、扩展不能办到的事

    a.不能覆盖原有的功能。
    b.不能添加存储属性,不能向已有的存储属性添加属性观察器。
    c.不能添加父类。
    d.不能添加指定初始化器,不能添加反初始化器。

    二、协议

    • 如果一个类型已经实现了协议的所有要求,但是还没有声明它遵守了这个协议。可以通过扩展让它遵守这个协议。
    • 协议可以给协议提供默认实现,也简介实现【可选协议】的效果。
    • 扩展可以给协议扩充【协议中从未声明过的方法】
    extension TestProtocol{
        func test1() {
            print("执行了test1方法")
        }
        func test2() {
            print("执行协议中未声明过的方法test2")
        }
    }
    

    三、访问控制

    1、访问控制方面 ,Swift提供了5个不同的访问级别(以下是从高到低排列的)
    • open:允许在定义实体的模块、其他模块中访问,允许其他模块进行集成、重写(open只能用在类,类成员上)。
    • public:允许在定义实体的模块、其他模块中访问,不允许其他模块进行集成、重写。
    • internal:只允许在定义的实体模块中访问,不允许在其他模块中访问。
    • fileprivate:只允许在定义实体的源文件中访问。
    • private:只允许在定义实体的封闭声明中访问。
    2、访问级别使用准则

    一个实体不可以被更低访问级别的实体定义,例如:

    • 父类≥子类
    • 父协议≥子协议
    • 变量/常量类型≥变量/常量
    3、泛型类型
    • 泛型类型的访问级别是类型的访问级别以及所有泛型类型参数的访问级别中最低的那个。(木桶原理)
      internal class Car {}
      fileprivate class Dog {}
      public class Person<T1, T2> {}
      //Person<Car,Dog>的最低访问级别是fileprivate
      fileprivate var p = Person<Car,Dog>()
    
    4、成员、嵌套类型
    • 类型的访问级别会影响成员(属性、方法、初始化器、下标)、嵌套类型的默认访问级别
      a.一般情况下,类型为privte或fileprivate,那么成员、嵌套类型默认也是privte或fileprivate。
      b.一般情况下,类型为internal或public,那么成员、嵌套类型默认是internal
    5、getter、setter

    getter、setter默认自动接收他们所属环境的访问级别
    可以给setter单独设置一个比getter更低的访问级别,用以限制写的权限。

    6、初始化器
    • 如果一个public类想在另一个模块调用编译生成的默认无参初始化器,必须显式提供public的无参初始化器,因为public类的默认初始化器是internal级别。
    • required初始化器≥它的默认访问级别
    • 如果结构体有private\fileprivate的存储实例属性,那么它的成员初始化器也是private\fileprivate,否则默认就是internal
    7、枚举类型的case
    • 不能给enum的每个case单独设置访问级别
    • 每个case自动接收enum的访问级别
      public enum定义的case也是public
    8、协议
    • 协议中定义的要求自动接收协议的访问级别,不能单独设置访问级别。
    • 协议实现的访问级别必须≥类型的访问级别,或者≥协议的访问级别。
      下面的代码编译无法通过:
    public protocol Runnable{
        func run()
    }
    public class PersonOne : Runnable {
        func run() {}
    }
    

    错误提示:Method 'run()' must be declared public because it matches a requirement in public protocol 'Runnable' (方法run必须声明为public,因为它必须匹配声明为public的协议Runnable)

    修改后:

    public class PersonOne : Runnable {
        public func run() {}
    }
    
    9、扩展
    • 可以单独给扩展添加成员设置访问级别。
    • 如果有显示设置扩展的访问级别,扩展添加的成员自动接收扩展的访问级别。
    • 如果没有显示设置扩展的访问级别,扩展添加的成员的默认访问级别,和直接在类型中定义的成员一样。
    • 不能给用于遵守协议的扩展显式设置扩展的访问级别。

    相关文章

      网友评论

          本文标题:Swift扩展&协议&访问控制

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