Swift中class和static的异同

970 阅读2分钟

相同点:

一、定义类型方法

类型方法,都可以可以用 class或static定义。另外计算属性本质就是set/get方法,所以也可以用 class或static定义类型计算属性。

1.只有class对象才允许使用class关键字,结构体、协议内、枚举只能使用static关键字

(1).结构体

struct Studnet{
   static func test1(){}

   static var age:Int{
       set{}
       get{
           return 20;
       }
    }
}

(2).类

class Studnet{
   
   class func test(){}
    
   static func test1(){}

   static var age:Int{
       set{}
       get{
           return 20;
       }
    }

   class var age:Int{
       set{}
       get{
           return 20;
       }
    }

}
Studnet.test()
Studnet.test1()

(3).枚举

enum Seanson{
    case Spring,Summer,Autonm,Winter
    
    static func test(){
    }
    
   static var age:Int {
        return 20
    }
}

(4).协议

protocol TestProtocol{
  static  var age:Int { get set }
}

二、定义类型存储属性

  • 定义类型存储属性,只能使用static,不允许使用class
class Student {
   static var age:Int = 20
}

struct Person {
   static var age:Int = 20
}

enum Seanson{
    case Spring,Summer,Autonm,Winter
    static var age:Int = 20
}

三、其他不同点:

  • class 修饰的计算属性可以被重写,static 修饰的不能被重写。

  • static 可以修饰存储属性,static 修饰的存储属性称为静态变量(常量)。

  • static 修饰的静态方法不能被重写,class 修饰的类方法可以被重写。

  • class 修饰的类方法被重写时,可以使用static 让方法变为静态方法。

  • class 修饰的计算属性被重写时,可以使用static 让其变为静态属性,但它的子类就不能被重写了。

  • 有一个比较特殊的是protocol。在Swift中class、struct和enum都是可以实现protocol的。那么如果我们想在protocol里定义一个类型域上的方法或者计算属性的话,应该用哪个关键字呢?答案是使用class进行定义,但是在实现时还是按照规则:在class里使用class关键字,而在struct或enum中仍然使用static,虽然在protocol中定义时使用的是class。

相同点:

  • 可以修饰方法,static 修饰的方法叫做静态方法,class 修饰的叫做类方法。
  • 都可以修饰计算属性。