首页 > 其他分享 >Swift 中的static 和 class 关键字使用及区别

Swift 中的static 和 class 关键字使用及区别

时间:2023-03-14 17:24:27浏览次数:34  
标签:Dog 关键字 static Animal Swift class 属性

在 Swift 中,staticclass 关键字都可以用来修饰类的属性和方法,但它们之间有三个主要的区别:

  1. 继承性:使用 class 修饰的属性和方法可以被子类重写,而使用 static 修饰的属性和方法不能被子类重写。因此,如果你想让一个属性或方法可以被子类重写,应该使用 class 关键字。

  2. 访问权限:使用 static 修饰的属性和方法只能在定义它们的作用域内被访问,而使用 class 修饰的属性和方法可以在定义它们的作用域内和子类中被访问。因此,如果你想让一个属性或方法可以被子类访问,应该使用 class 关键字。

  3. 动态派发:使用 class 修饰的属性和方法支持动态派发,也就是说,它们的实际实现可能是由子类提供的。而使用 static 修饰的属性和方法不支持动态派发,它们的实现是由定义它们的类提供的。因此,如果你需要动态派发的能力,应该使用 class 关键字。

下面是一个使用 staticclass 关键字的示例:

class Animal {
    static var numberOfLegs = 0
    class func makeSound() {
        print("Animal makes a sound")
    }
}

class Dog: Animal {
    override class func makeSound() {
        print("Dog barks")
    }
}

struct Bird {
    static var numberOfWings = 0
    static func fly() {
        print("Bird is flying")
    }
}

Animal.numberOfLegs = 4
print(Animal.numberOfLegs) // 输出: 4

Dog.makeSound() // 输出: Dog barks

Bird.numberOfWings = 2
Bird.fly() // 输出: Bird is flying

在上面的代码中,我们使用 static 关键字来定义了 AnimalnumberOfLegs 属性和 BirdnumberOfWings 属性以及 fly() 方法。这些属性和方法只能在定义它们的作用域内被访问,不能被子类重写,并且它们的实现是由定义它们的类或结构体提供的。

另一方面,我们使用 class 关键字来定义了 AnimalmakeSound() 方法,这个方法可以被子类重写并支持动态派发。在 Dog 子类中,我们重写了 makeSound() 方法,并修改了它的实现。当我们调用 Dog.makeSound() 时,程序会动态派发到 Dog 类的实现。

总之,使用 staticclass 关键字可以使我们更好地控制属性和方法的访问和重写权限,并支持动态派发。

标签:Dog,关键字,static,Animal,Swift,class,属性
From: https://www.cnblogs.com/samniu/p/17215638.html

相关文章

  • Swift与Objective-C常量定义的不同
    在Objective-C中,使用const关键字定义的常量是在编译时被解析的,它们的值是静态的,不能在运行时改变。同时,这种方式定义的常量需要通过C语言的方式来访问和使用。而在......
  • 安卓 静态文件读取 staticFile
    //静态文件的读取Resourcesresources=getResources();InputStreamopenRawResource=resources.openRawResource(R.raw.text);try{byte[]byte1=newbyte[openRawR......
  • python类中的@property和@staticmethod分别有什么用,还有其他的吗?
    @property和@staticmethod是Python中常用的装饰器,它们分别有以下特点:@property:@property用于将一个方法转化为属性,从而可以像访问属性一样访问该方法。例如,如果一个类有......
  • SpringCloud多模块项目打包报错Unable to find main class
    SpringCloud多模块项目打包报错Unabletofindmainclass彻底解决方法:所有子模块都去掉打包插件代码,在parent模块的pom中加上 <build>    <plugins>   ......
  • 22:swift-协议
      正文 /*22:协议1:协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足......
  • vscode中配置c#程序中的Configuration,使其输出在console.exe类型与classlib库类型之间
    应用场景:最终目标是输出classlib库类型为dll,给js程序调用;但是中途需要可以断点调试。最初做法是另外创建个console程序,引用目标类库,但是在vscode中不知道怎么断点调试引用......
  • static_cast源码
    编译期做类型检查,c++11引入,解决c语言直接转换不安全的问题/方便找转换代码build_static_cast_1build_static_cast......
  • CDS即Class-Data Sharing
    引用:https://docs.oracle.com/en/java/javase/17/vm/class-data-sharing.html#GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91 类数据共享(CDS)功能,该功能有助于......
  • 静态类型转换:static_cast
    静态类型转换:static_cast//用于基本类型的转换,即内置类型,但不可用于基本类型指针的转换inta=10;int*pi=&a;char*pc=static_cast<char*>(pi);//错误,不可用......
  • class
    class1.类初始化时,代码块优先本类构造器执行2.静态代码块优先于普通代码块执行3.等级相同的代码(代码块/变量),按照定义的先后顺序执行4.构造器先执行父类构造器,后执行子......