Swift - Static和Class

static 和 class

在Swift中static和class都表示“类型范围作用域”的关键字。在所有类型中(class、static、enum)中,我们可以使用static来描述类型作用域。class是专门用于修饰class类型的。


static可以修饰属性和方法

class Person {
    // 存储属性
    static let age: Int = 20

    // 计算属性
    static var wotkTime: Int {
         return 8
    }
    // 类方法
    static func sleep() {
        print("sleep")
    }
}

但是所修饰的属性和方法不能够被重写,也就是说static修饰的类方法和属性包含了final关键字的特性。重写会报错如下:


class修饰方法和计算属性

我们同样可以使用class修饰方法和计算属性,但是不能够修饰存储属性


而且类方法和计算属性是可以被重写的,可以使用class关键字也可以是static

class Student: Person {
    
//    使用class
//    override class func sleep() {
//    }
//    override class var workTime: Int {
//        return 10
//    }

    // 使用static
    override static func sleep() {
    }
    override static var workTime: Int {
        return 10
    }
}

static和protocol

Swift中的class,struct,enum都可以实现某个指定的协议。如果我们想在protocol中定义一个类型作用域上的方法或者计算属性,应该使用哪个关键字?答案显而易见,肯定是static,因为static是通用的。注意:在使用protocol的时候,在enum和struct中仍然使用static进行修饰,在class中,class和static都可以使用。

protocol MyProtocol {
    static func foo() -> String
}

struct MyStruct: MyProtocol {
    static func foo() -> String {
        return "MyStruct"
    }
}

enum MyEnum: MyProtocol {
    static func foo() -> String {
        return "MyEnum"
    }
}

class MyClass: MyProtocol {
    // 在 class 中可以使用 class
    class func foo() -> String {
        return "MyClass.foo()"
    }

    // 也可以使用 static
    static func bar() -> String {
        return "MyClass.bar()"
    }
}

参考:

static和class


猜你喜欢

转载自blog.csdn.net/longshihua/article/details/79415553