Swift中的访问修饰符对于扩展(extension)的影响

在Swift中,有一种结构extension,类似于OC中的Category分类,非常适合于对代码进行管理

同时,常用的访问修饰符有public、internal、private,而对于这三个访问修饰符,对extension的影响是各不一样的

在本文中,我将对同一文件下和不同文件下的extension、在本类和其他类调用,共四种情况进行分别介绍。

在介绍前,我先创建了一个非常简单的iOS项目,并新建了一个Person类和Person类的extension文件,如下图:

其中,Person类的代码如下:

Person+Extension文件中的代码如下:

从上面的代码可以看到,在Person类本文件中的extension创建了两个函数,分别是getAge()和getGender()

在Person+Extension文件中创建了两个函数,叫sayHello()和sayGoodBye()

而具体的测试,将分别在Person本类的printSomething()和ViewController类的viewDidLoad()两个函数中分别进行

1、internal

internal是一个作用域介于public和private之间的访问修饰符,也是swift中默认的访问修饰符,通常是直接省略的

internal既不像public那么有开放性,也不像private那么封闭

a.同一文件下的extension,在其他类中调用:

在ViewController文件中直接调用Person类本文件extension中的方法如下:

可以很清楚的看到,是可以很直接的调用到这个函数的

b.不同文件下的extension,在其他类中调用:

接下来调用Person+Extension的sayHello()函数:

在这种情况下,非同一文件下的extension中的函数也是可以调用到的

c.同一文件下的extension,在本类中调用:

在Person类中测试结果如下:

d.不同文件下的extension,在本类中调用:

在Person类中测试结果如下:

结论:在internal或无修饰符情况下,不论extension中的函数和类文件是否在同一文件中,均可以顺利调用执行

2、private

private在各个编程语言中都表示私有方法/函数,在此我们均尝试一下使用private后两种情况下的extension函数

在开始前先

a.同一文件下的extension,在其他类中调用:

根据测试,即使是extension与类在同一文件中,在ViewController中也无法调用到被private修饰的函数getGender()

b.不同文件下的extension,在其他类中调用:

测试后结果显示,extension与类在不同文件中的情况下,ViewController同样无法调用到被private修饰的函数sayGoodBye()

c.同一文件下的extension,在本类中调用:

经测试,在此情况下,本类可以调用到与类在同一文件下的extension中被private修饰的函数

d.不同文件下的extension,在本类中调用:

测试结果显示,与类不在同一文件的extension中的被private修饰的函数,即使在本类中也无法调用

结论:在private修饰的extension函数中,仅有与类在同一文件的可以被顺利调用,其他情况下均无法被调用

3、public

public因其开放性,在任何位置均可以调用被public修饰的方法/函数,因此通常用于全局性的变量、属性或者方法。

在测试前将原来没有使用访问修饰符的getAge()和sayHello()函数前分别加上public修饰符。

而实际测试中,直接在方法前加上public修饰符会提示警告如下:

针对这种情况,Xcode编译器建议将public替换为internal,为解决这个问题,必须在类声明前也加上public才可以

即证明:只有在public修饰的类中才可以存在被public修饰的函数

经修改后继续测试,测试结果依次如下:

a.同一文件下的extension,在其他类中调用:

b.不同文件下的extension,在其他类中调用:

c.同一文件下的extension,在本类中调用:

d.不同文件下的extension,在本类中调用:

结论:被public修饰的函数,不论是否与本类在同一文件,在本类和其他类中均可以被调用

综上所有结论如下:

访问修饰符 同一文件,其他类调用 不同文件,其他类调用 同一文件,本类调用 不同文件,本类调用
internal 可以被调用 可以被调用 可以被调用 可以被调用
private 不可以 不可以 可以被调用 不可以
public 可以被调用 可以被调用 可以被调用 可以被调用

表格注释:同一文件和不同文件仅代表函数所在extension是否与所在类是同一个文件

参考文章:https://github.com/bboyfeiyu/iOS-tech-frontier/blob/master/issue-4/Swift扩展的三个微妙细节.md

时间: 2024-10-07 08:22:10

Swift中的访问修饰符对于扩展(extension)的影响的相关文章

20151024_004_C#基础知识(C#中的访问修饰符,继承,new关键字,里氏转换,is 和 as,多态,序列化与反序列化)

1:C#中的访问修饰符 public: 公共成员,完全公开,没有访问限制. private: 私有的,只能在当前类的内部访问. protected: 受保护的,只能在当前类的内部以及该类的子类中访问. internal: 只能在当前项目中访问,在同一个项目中,internal和public的权限是一样的. protected internal: protected + internal权限. 1.1:能够修饰类的访问修饰符只有两个: public / internal 1.2:接口中的成员不允许

(转) java中的访问修饰符

对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节.访问控制分为四种级别: (1)public: 用public修饰的类.类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问: (2)protected: 用protected修饰的类.类属变量及

PHP中有三种访问修饰符 默认是public

PHP中有三种访问修饰符,分别是: public(公共的.默认) protected(受保护的) private(私有的) 它们可以分别用在类的属性和方法上(类的属性和方法统称为类的成员),用来修饰类成员的访问权限. public(公共的.默认) 在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限. /* 以下两个方法声明访问权限效果相同 */ function say(){}; publilc function say(){}; 当类的成员被声明为public的访问修饰

C#中的访问修饰符,默认访问修饰符

c#中的访问修饰符   public :公开的公共的 private:私有的,只能在当前类的内部访问 protected:受保护的,只能在当前类的内部以及该类的子类中访问. internal:只能在当前项目中访问.在同一个项目中,internal和public的权限是一样. protected internal:protected+internal 默认访问修饰符 默认情况下,类型成员是隐式私有的,而类型是隐式内部的.类型默认构造函数是私有的. protect和private拿去声明类型,除非这

php中的访问修饰符

php中的访问修饰符Public, protected, private Public:公共的:类内,类外,继承链类内.//公共的都可以调用. Protected: 类内,继承链类内.//受保护的,在本类,本类的继承体系内部调用. Private:本类内.//私有的,只能在本类内部调用

C#中的访问修饰符

1.C#中的访问修饰符public :公开的公共的private:私有的,只能在当前类的内部访问.protected:受保护的,只能在当前类的内部以及该类的子类中访问. internal:只能在当前程序集(项目)中访问.在同一个项目中,internal和public的权限是一样的.protected internal:protected+internal 1)能够修饰类的访问修饰符只有两个:public,internal2) 可访问性不一致.子类的访问权限不能高于父类的访问权限.会暴露父类的成员

Java语言中的-----访问修饰符

day04 Java语言中的----访问修饰符 一.访问修饰符概述: 访问修饰符就是对变量或者是方法或者是类的一个修饰,通过修饰以后实现一些必要的权限,主要是说明类成员如何被使用的作用. 二.访问修饰符 1.访问修饰符有哪些? 访问修饰符总共有8种,本文只先给大家说static和final两个修饰符 1.1.final.修饰常量的 1.2.static.修饰静态的 1.3.abstract. 1.4.native. 1.5.sysnchronized.修饰线程的 1.6.transient. 1

java中抽象类与接口中方法访问修饰符问题 (

1.抽象类中的抽象方法(其前有abstract修饰)不能用private.static.synchronized.native访问修饰符修饰.原 因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰:static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽 象方法用static修饰没有意义:使用synchronized关键字是为该方法加一个锁..而如果该关键字修饰的方法是static方法.则使用的锁 就是class变量的锁.如果是修饰 类方法.则用this变量锁

JAVA中的访问修饰符和包

一.JAVA访问修饰符 访问修饰符,用来控制类中成员的可见性 有四个访问修饰符,分别是:default,private,public,protected 1.default(默认):默认时不需要写修饰符的.只能在同一包内访问. 2.private(私有):只能在同一类中访问. 3.public(公有):在任何地方都可以访问 4.protected(受保护的):类的继承中使用 二.包package 在大型项目中,往往会有几十甚至几百个类,如果不对类进行分类管理,后期进行维护时会有很大的不便. 所以