属性与方法

一 属性

  • 属性的存储

  • 延时存储属性

  • 计算属性

  • 属性观察者

  • 静态属性

注意:OC中的属性的替代get/set的方法,为了实现对成员变量的封装,实际上是swift中的计算属性。

1.存储

在swift中的属性存储就是OC中的一般意义上的成员变量,ps:swift中是没有成员变量的

实例化:
//结构体的属性初始化不用需要赋值
struct FixedRangeStruct{
    var firstValue:Int
    let length:Int
}
var rangeOfStruct = FixedRangeStruct(firstValue:0,length:4)
rangeOfStruct.firstValue = 12

//类的属性初始化需要赋值
class FixedRangeClass {
    var firstValue = 0
    let lenth = 0
}
var rangeOfClass = FixedRangeClass()
rangeOfClass.firstValue = 12

2.延时储存属性

类内部属性实例化的时候,使用lazy代表暂不实例化,等第一次使用的时候再实例化。这样的好处的,当类的属性是另一个类的时候,而且属性类极少使用的时候,可以防止一次性加载2个类的东西。

使用场景:属性使用类低,而且属性结构大,就可以使用lazy。如果是小属性,或者属性类十分频繁使用,那千万不要使用lazy

class DataImporter {
    var fileName = "data.txt"
}

class DataManager {
    lazy var importer = DataImporter()
    var data = ""
}

let manager = DataManager()
manager.data += "Some data"
print(manager.importer.fileName)

3.计算属性

有的时候一些属性是通过其他的属性计算出来的,通过get和set访问器对其访问

struct Point {
    var x = 0.0,y = 0.0
}

struct Size {
    var width = 0.0,height = 0.0
}

struct Rect {
    var orgin = Point()
    var size = Size()
    var center : Point{
        get{
            let centerX = orgin.x + (size.width/2)
            let centerY = orgin.y + (size.height/2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter){
            orgin.x = newCenter.x - (size.width/2)
            orgin.y = newCenter.y - (size.height/2)
        }
    }
}


var square = Rect(orgin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
//get
let initSquareCenter = square.center
//set
square.center = Point(x: 15.0, y: 15.0)

print("\(initSquareCenter)、(\(square.orgin.x),\(square.orgin.y))")

4.属性观察者

为了监听属性的变化,swift通过了属性观察者

  • willSet观察者是在存储之前调用

  • didSet新值存储后调用

class StepCounter {
    var totalSteps:Int = 0{
        
        willSet(newTotalSteps){
            print("About to set totalSteps to \(newTotalSteps) ")
        }
        
        didSet{
            if totalSteps > oldValue{
                print("Add \(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCount = StepCounter()

stepCount.totalSteps = 200
stepCount.totalSteps = 360

About to set totalSteps to 200 
Add 200 steps
About to set totalSteps to 360 
Add 160 steps

5.静态属性

静态属性在结构体中使用static定义,类中使用class定义。

struct AudioChannel {
    
    static let threshldLevel = 10
    static var maxInputLeveForAllChannels = 20
    var currentLevel : Int = 0
    static var computedTypePropetry:Int{   //可以修饰函数,成为静态方法
        return 2
    }
    
}

var leftChannel = AudioChannel()
var righrChannel = AudioChannel()

leftChannel.currentLevel = 7
print(leftChannel.currentLevel)

print(AudioChannel.maxInputLeveForAllChannels) //调用静态属性的时候,只能有类名,不能有实例名



二 方法

类和结构体内的函数就是方法

1分类

1> 实例方法

func修饰的方法就是实例方法

2> 静态方法

被静态符static或class修饰的方法就是静态方法


3 使用self

为区分类或结构体内的属性与类属性冲突

struct Point {
    
    var x = 0.0, y = 0.0
    
    func isToTheRightOfx(x:Double) -> Bool{
        return self.x > x
    }
}

let somePoint = Point(x: 4.0, y: 5.0)

if somePoint.isToTheRightOfx(1.0){
    print("yes")
}


你可能感兴趣的:(属性与方法)