swift 学习 修饰关键词

89 阅读4分钟

/// 修饰关键词  1. final  最终版本的意思。用final修饰的类 ,不相同模块和不同模块都是不可继承的。同样。用final修饰的方法和属性 也都是不可以被重写的。这个关键字比较独立。它不受上级权限的影响。第二个作用是final修饰的方法。最后是直接分发的方式调用。 并不是再 协议/方法续表调用方式效率高

    ///open public 关键字。 情况1. open 仅仅可以用修饰类,不可以修饰结构体。public 既可以用来修饰类,也可以用来修饰结构体。 用open修饰的类。不管是在同模块下还是不同模块下使用这个类都是可以被继承的。而用public修饰得类 ,模块内和模块外都可以使用。再同一模块内 也是可以被继承的(以上情况不管方法和属性修饰词是什么都符合)。而在不同模块里面对于其他模块使用public修饰的类是否可以被其他模块继承,还需要看其内部属性和方法的修饰词。如果类里面的方法和属性都是public/open的比public 等级高的。其他模块就可以继承。如果类里面的方法和属性有比public低的,就不能被外部继承。

    /// internal 修饰符修饰类的时候,它是默认修饰符。如果没有写 修饰符的时候,编译器默认设置为internal。在统一模块下可以被继承,不同模块下 ,不可被使用。

    /// fileprivate 修饰的类 只能是本类文件使用。不同模块下 ,不可被使用。

    /// private 修饰的类 本文件内也不能使用,是能是上级权限内使用。修饰类的时候和fileprivate一样,都是同一文件内可以使用该类。

    

    

    /// 对于修饰类的修饰符总结。 如果你要是想开发第三方库。 如果想让别人仅仅使用 最好用 public final 。如果想要继承 ,最好使用 open 修饰。 虽然使用public 然后其他属性和方法都是使用public 或者open修饰符也可以被其他模块继承,但是就没法有自己私有的方法等属性了 。不推荐。

    /// 对于方法和属性。 这里有个概念 方法和属性 的修饰符 受 类的修饰符的影响。并且 方法和属性的修饰符也会对类的修饰符有影响。 先说方法和属性的修饰符对类的影响 就是上面讲过的public。如果方法和属性的修饰符比public低 那么在其他模块 这个类不能被继承。

    /// 再说类的修饰符对方法和属性的修饰符的影响。我们提一个概念。方法和方法的作用域在类下边。修饰符受影响是级别高的修饰符 对级别低的修饰符有影响。

    /// 影响1.比如默认修饰符 是internal。方法和属性的修饰符。如果类的修饰符比internal高。那么方法和属性的修饰符没有给,默认就是internal。如果类的修饰符比internal低。那么方法和属性的默认修饰符就是类的修饰符。

    /// 影响2.方法和属性的修饰符不能高于它们所属类的修饰符的等级。

    ///以上是swift5.0之前的版本。也是大家遵守编码遵守设计封装和安全性的原则。但是再swift5.0以上版本。类的方法和属性的修饰符不再受类的限制。可以随意设置。唯一还保留的是 默认修饰符的影响。以及方法和属性的修饰符对于public修饰的类在外部模块的时候是否能被继承的影响。

    ///综上。方法和属性的修饰词。其实就是独立的。基本不受类的影响。除了默认规则下。

    

    /// 再来说一下 一个属性的类型 和一个方法的参数的类型和返回值的类型 对方法和属性修饰符的影响

    /// 属性类型和方法的参数或返回值 类型的修饰符访问权限 是对属性和方法修饰符有影响的。一个类的属性和方法的返回值参数的类型的修饰符要高于 这个类的属性和方法的返回值。这也同样要求了。

    /// 属性的类型的修饰符只需要影响属性的修饰符就可以了。属性的类型的修饰符不需要影响类的修饰符。

    

    /// 最后介绍继承的情况

    /// 1. 继承的类的修饰符

    /// 2.继承的类重写的父类的方法和属性的修饰符,对于类 子类的修饰符不能比父类的修饰符级别小。可以相等

    /// 3.类里面的属性和方法的基础。仍然是 不能低于父类的修饰符级别。 注意存储属性子类不能重写。只能重写为计算型属性

   

    

    

    /// 拓展的里面的 区别是 fileprivate修饰的方法和属性 可以再同一文件的拓展里面使用, 但是 private修饰的方法和属性 在拓展里面 是不可用的