OC和Swift中的static

前端之家收集整理的这篇文章主要介绍了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? }

编译时会得到一个错误

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 ,
Point(x:
1 ,y: - 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的一些描述可能在未来的失效,请注意甄别。如内容有误,欢迎指出。

猜你在找的Swift相关文章