swift与properties

import Foundation


//一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量

struct FixedLengthRange {

    var firstValue: Int

    let length: Int

}

var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

// 该区间表示整数012

rangeOfThreeItems.firstValue = 6

// 该区间现在表示整数678




//常量和存储属性

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)

// 该区间表示整数0123

//rangeOfFourItems.firstValue = 6

// 尽管firstValue诗歌变量属性,这里还是会报错





//延迟存储属性。延迟存储属性是指 当第一次被调用的时候才会计算其初始值的属性

//在属性声明前使用lazy来标示一个延迟存储属性,必须将延迟存储属性声明成变量

class DataImporter {

    /*

    DataImporter 是一个将外部文件中的数据导入的类。

    这个类的初始化会消耗不少时间。

    */

    var fileName = "data.txt"

    // 这是提供数据导入功能

}


class DataManager {

    lazy var importer = DataImporter()

    var data = [String]()

    // 这是提供数据管理功能

}


let manager = DataManager()

manager.data.append("Some data")

manager.data.append("Some more data")

// DataImporter 实例的 importer 属性还没有被创建


println(manager.importer.fileName)

// DataImporter 实例的 importer 属性现在被创建了

// 输出 "data.txt”






//计算属性。类、结构体和枚举可以定义 计算属性,计算属性不直接存储值,而是提供一个 getter 来获取值,一个可选的 setter 来间接设置其他属性或变量的值

struct Point {

    var x = 0.0, y = 0.0

}

struct Size {

    var width = 0.0, height = 0.0

}

struct Rect {

    var origin = Point()

    var size = Size()

    var center: Point {

        get {

            let centerX = origin.x + (size.width / 2)

            let centerY = origin.y + (size.height / 2)

            return Point(x: centerX, y: centerY)

        }

        set(newCenter) {

            origin.x = newCenter.x - (size.width / 2)

            origin.y = newCenter.y - (size.height / 2)

        }

        /*

        set {

            origin.x = newValue.x - (size.width / 2)

            origin.y = newValue.y - (size.height / 2)

        }

        */

    }

}

var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))

let initialSquareCenter = square.center

square.center = Point(x: 15.0, y: 15.0)

println("square.origin is now at (\(square.origin.x), \(square.origin.y))")

// 输出 "square.origin is now at (10.0, 10.0)




//只读计算属性

struct Cuboid {

    var width = 0.0, height = 0.0, depth = 0.0

    

    //只读计算属性的声明可以去掉get关键字和花括号

    var volume: Double {

        return width * height * depth

    }

}

let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)

println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")

// 输出 "the volume of fourByFiveByTwo is 40.0





//属性监视器

//属性监视器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性监视器,甚至新的值和现在的值相同的时候也不例外

//可以为除了延迟存储属性之外的其他存储属性添加属性监视器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性监视器

class StepCounter {

    var totalSteps: Int = 0 {

        willSet(newTotalSteps) {

            println("About to set totalSteps to \(newTotalSteps)")

        }

        didSet {

            if totalSteps > oldValue  {

                println("Added \(totalSteps - oldValue) steps")

            }

        }

    }

}

let stepCounter = StepCounter()

stepCounter.totalSteps = 200

// About to set totalSteps to 200

// Added 200 steps

stepCounter.totalSteps = 360

// About to set totalSteps to 360

// Added 160 steps

stepCounter.totalSteps = 896

// About to set totalSteps to 896

// Added 536 steps

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值