相同点:
一、定义类型方法
类型方法,都可以可以用 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 修饰的叫做类方法。
- 都可以修饰计算属性。