Swift 方法⑧

2020-08-04  本文已影响0人  Aliv丶Zz

1. 方法

枚举、结构体、类都可以定义方法,方法可分为:


self关键字:

class Car {
    static var count = 0
    var id = 1
    
    init() {
        Car.count += 1
    }
    //类型方法
    static func getCount() -> Int {
        count //等同于 self.count / Car.count  / Car.self.count
    }
    //实例方法
    func getId() -> Int {
       id// 等同于 self.id
    }
}

mutating 关键字

struct Point {
    var x = 0.0, y = 0.0
    mutating func addValue(_ addX: Double, _ addY: Double){
        x += addX
        y += addY
    }
 }
//枚举
enum StateSwitch {
    case low, middle, heigh
    mutating func change()  -> StateSwitch{
        print("111")
        switch self {
        case .low:
            self = .middle
            
        case .middle:
            self = .heigh
        case .heigh:
            self = .low
        
        }
        return self
    }
}
var sts = StateSwitch.low
print(sts.change())//输出结果为: middle

如果不加mutating,则会报错:Left side of mutating operator isn't mutable: 'self' is immutable


@discardableResult 关键字


subscript 关键字 - 下标

class Point {
    var x = 0.0 , y = 0.0
    
    subscript (index: Int) -> Double{
        set{
            if index == 0 {
                x = newValue
            }else if index == 1{
                y = newValue
            }
        }
        get{
            if index == 0 {
                return x
            }else if index == 1{
                return y
            }
            return 0
        }
    }
}
var p = Point()
p[0] = 10
p[1] = 11
print(p.x , p[1])//输出结果:10,11

结构体、类作为返回值时对比:

struct Point {
      var x = 0.0 , y = 0.0
}
class PointManager {
    var point = Point()
    subscript(index: Int) -> Point{
        set{
            point = newValue
        }
        get{
            point
        }
    }
 }
var pm = PointManager()
pm[0].x = 66
pm[1].y = 77
print("pm:",pm.point.x,pm.point.y)//输出结果:pm: 66.0 77.0
注意:
  1. 如果Point是Class,则可以直接省略set,也可以直接修改对应的值
  2. 但如果是结构体或枚举类型,则不可以胜率,需加上point = newValue 才可以对point进行修改
  • 因为结构体、枚举是值类型,值类型在进行赋值给set、var时,都是深拷贝。pm[0]相当于调用了get方法进行了深拷贝,在对其进行修改操作时,并不会真的修改point的值,所以如果想要真正的修改point的值需加上
    set{
    point = newValue
    }
  • 如果是class的话。point是存储的地址指针。所以可以对其直接操作
class Sum {
   class subscript (v1: Int , v2: Int) -> Int{
        return v1 + v2
    }
}

print(Sum[10,20])//输出结果:30

上一篇下一篇

猜你喜欢

热点阅读