Swift中表示“类型范围作用域”的有两个关键字static和class
在非class的类型上下文中,我们统一使用static来描述类型作用域。这包括enum和struct中表述类型方法和类型属性时。在这两个值类型中,我们可以在类型范围中声明并使用存储属性,计算属性和方法。static适用场景有这些:
struct Point {
let x: Double
let y: Double
// 存储属性
static let zero = Point(x: 0, y: 0)
// 计算属性
static var ones: [Point] {
return [Point(x: 1, y: 1),
Point(x: -1, y: 1),
Point(x: 1, y: -1),
Point(x: -1, y: -1)]
}
// 类方法
static func add(p1: Point, p2: Point) -> Point {
return Point(x: p1.x + p2.x, y: p1.y + p2.y)
}
} ```
> 注意: class修饰的类中不能使用class来存储属性的
class MyClass {
class var bar: Bar?
}
编译器报错:`class variables not yet supported`
> 有一个比较特殊的是protocol,在Swift中class、struct和enum都是可以实现protocol的,那么如果我们想在protocol里定义一个类型域上的方法或者计算属性的话,应该用哪个关键字呢?答案是使用class进行定义,但是在实现时还是按照上面的规则:在class里使用class关键字,而在struct或enum中仍然使用static——虽然在protocol中定义时使用的是class:
e.g.:
protocol MyProtocol {
class 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 func foo() -> String {
return "MyClass"
}
}```