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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...