swift 里的class和static

Swift开发必备技巧:static和class的使用

发表于 2015-01-28 14:12| 8480次阅读| 来源 Swifter| 7 条评论| 作者 王巍
摘要:Swift中表示“类型范围作用域”这一概念有着两个不同的关键字,分别为static和class,而在OC等其他语言中,开发者不会特地区分变量/类方法和静态变量/静态函数。本文作者王巍在这篇Tip中详解了static和class的使用。

Swift中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是static和class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在Swift中,这两个关键字却是不能用混的。

在非class的类型上下文中,我们统一使用static来描述类型作用域。这包括在enum和struct中表述类型方法和类型属性时。在这两个值类型中,我们可以在类型范围内声明并使用存储属性,计算属性和方法。static适用的场景有这些:

  1. struct Point {  
  2.     let x: Double  
  3.     let y: Double  
  4.     // 存储属性  
  5.     static let zero = Point(x: 0, y: 0)  
  6.     // 计算属性  
  7.     static var ones: [Point] {  
  8.         return [Point(x: 1, y: 1),  
  9.                 Point(x: -1, y: 1),  
  10.                 Point(x: 1, y: -1),  
  11.                 Point(x: -1, y: -1)]  
  12.     }  
  13.     // 类型方法  
  14.     static func add(p1: Point, p2: Point) -> Point {  
  15.         return Point(x: p1.x + p2.x, y: p1.y + p2.y)  
  16.     }  
  17. }  

enum的情况与这个十分类似,就不再列举了。

class关键字相比起来就明白许多,是专门用在class类型的上下文中的,可以用来修饰类方法以及类的计算属性。要特别注意class中现在是不能出现存储属性的,我们如果写类似这样的代码的话:

  1. class MyClass {  
  2.     class var bar: Bar?  
  3. }  

编译时会得到一个错误:

class variables not yet supported

这主要是因为在Objective-C中就没有类变量这个概念,为了运行时的统一和兼容,暂时不太方便添加这个特性。Apple表示今后将会考虑在某个升级版本中实装class类型的类存储变量,现在的话,我们只能在class中用class关键字声明方法和计算属性。

有一个比较特殊的是protocol。在Swift中class、struct和enum都是可以实现protocol的。那么如果我们想在protocol里定义一个类型域上的方法或者计算属性的话,应该用哪个关键字呢?答案是使用class进行定义,但是在实现时还是按照上面的规则:在class里使用class关键字,而在struct或enum中仍然使用static——虽然在protocol中定义时使用的是class:

  1. protocol MyProtocol {  
  2.     class func foo() -> String  
  3. }  
  4. struct MyStruct: MyProtocol {  
  5.     static func foo() -> String {  
  6.         return "MyStruct"  
  7.     }  
  8. }  
  9. enum MyEnum: MyProtocol {  
  10.     static func foo() -> String {  
  11.         return "MyEnum"  
  12.     }  
  13. }  
  14. class MyClass: MyProtocol {  
  15.     class func foo() -> String {  
  16.         return "MyClass"  
  17.     }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值