Swift:实例方法和类型方法

前端之家收集整理的这篇文章主要介绍了Swift:实例方法和类型方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

大家对“实例方法和类型方法”的概念应该不陌生了,在objective-c中很常见。例如:

1. 实例方法(减号开头)

  1. - (instancetype)init;
调用的时候,必须先进行实例化一个对象(alloc),然后调用init方法

2. 类型方法(加号开头)

  1. + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
调用的时候,直接使用UIView的类型就可以了。

而在Swift中写法有所改变,它使用class和static关键字来标示。而且不仅仅是作用在类中,枚举和结构体(enum,struct)中也有相应的方法

在class类型上下文中,我们使用class;其他的使用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 [
  9. Point(x: 1,y: 1),Point(x: -1,Point(x: 1,y: -1),y: -1)
  10. ]
  11. }
  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. }
  18.  
  19. let p = Point(x: 3,y: 4)
  20.  
  21. Point.zero
  22. Point.ones
  23. Point.add(Point(x: 1,y: 2),p2: Point(x: 2,y: 1))

可以看到,在结构中,我们可以在其属性或者方法前面加static进行修饰,调用的时候,直接可以通过类型名称"Point" 出对应的属性或者方法


二、作用

  1. class Square {
  2. // 类型属性,用class关键字
  3. class var PI: Double{
  4. return 3.14
  5. }
  6. }

可以看到,在类中,我们可以在其属性或者方法前面加class进行修饰,调用的时候,直接Square.PI 就可以了。 代码中是对“计算属性”进行了class修饰。而这里的计算属性只是简写,我们也可以写成下面的方式:
  1. class Square {
  2. class var PI: Double{
  3. get { return 3.14 }
  4. }
  5. }


但需要注意的是,存储属性不能使用class进行修饰。

  1. class Student {
  2. class var phone: String?
  3. }

编译后会报错:“class variables not yet supported

而用static就可以了。

  1. class Student {
  2. static var phone: String?
  3. }


三、作用协议
  1. protocol MyProtocol {
  2. static func foo() -> String
  3. }
  4.  
  5. struct MyStruct: MyProtocol {
  6. static func foo() -> String {
  7. return "MyStruct"
  8. }
  9. }
  10.  
  11. class MyClass {
  12. class func foo() -> String {
  13. return "MyClass"
  14. }
  15. }

可以看出,在protocol中定义的属性或者方法,是在其前面加上static修饰符的,但问题来了, 实现协议有可能是结构体或者枚举,也有可能是类。那实现体中应该使用什么修饰符?通过观察上面的写法可以看出:

在protocol中定义的方法或者计算属性,类型修饰符是static;在实现的结构或者枚举中,修饰符使用static,在实现的class中,修饰符使用class。

猜你在找的Swift相关文章