OC和Swift中的static

OC:
static关键字表示静态,可以放在局部变量和全局变量前面:
  • 限定做用域:对于静态全局变量来讲,针对某一源文件的以static声明的文件级变量与函数的做用域只限于文件内(只在文件内可见),也即“内部链接”,于是能够用来限定变量的做用域
  • 标明生存周期:对于静态局部变量来讲,在函数内以static声明的变量虽然与自动局部变量的做用域相同(即做用域都只限于函数内),但存储空间是以静态分配而非默认的自动分配方式获取的,于是存储空间所在区域不一样(通常来讲,静态分配时存储空间于编译时在程序数据段分配,一次分配全程有效;而自动分配时存储空间则是于调用栈上分配,只在调用时分配与释放),且两次调用间变量值始终保持一致(变量只会被初始化一次);
Swift:
static在Swift 中表示 “类型范围做用域”,可使用它来定义类型属性,最初的时候,Swift不支持class类型的类型存储属性,static关键字只能用于非class类型中:
旧文:
static在Swift 中表示 “类型范围做用域”,这一律念有两个不一样的关键字,它们分别是 staticclass。在非 class 的类型上下文中,咱们统一使用 static 来描述类型做用域,class 关键字 是专门用在 class 类型的上下文中的,能够用来修饰类方法以及类的计算属性。类方法就是静态方法,经过类类型能直接调用。
class 中如今是不能出现类的(静态)存储属性的,咱们若是写相似这样的代码的话:

class MyClass { class var bar: Bar? }

编译时会获得一个错误:ide

class variables not yet supported函数

 
这主要是由于在 Objective-C 中就没有类变量这个概念,为了运行时的统一和兼容,暂时不太方便添加这个特性。Apple 表示从此将会考虑在某个升级版本中实装 class 类型的类存储变量,如今的话,咱们只能在 class 中用 class 关键字声明方法和计算属性。
 
Swift1.2 以后,类也能够经过static关键字拥有 类型存储属性了,static至关于 class final标识符的别名,类中的static属性拥有全局做用域和懒加载属性。可是至此文章写做完成时,还不能经过class关键字来定义 类型存储属性,仅能经过class关键字定义类型计算属性。可见后续关于类型属性之后会更加完善。
“static” methods and properties are now allowed in classes (as an alias for class final). You are now allowed to declare static stored properties in classes, which have global storage and are lazily initialized on first access (like global variables).
 
  • 可使用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 SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
    static var storedClassProp = "class property not OK"
}
 
注:因为Swift还处于完善中,因此本文中关于Swift的一些描述可能在将来的某天失效,请注意甄别。如内容有误,欢迎指出。
相关文章
相关标签/搜索