iOS不错的文章Swift从0开始Swift

Swift-05-存储属性与计算属性

2016-01-02  本文已影响4464人  cornerAnt

1.存储属性

// 定义一个结构体如下,FixedLengthRange代表一个创建后无法改变的区间
struct FixedLengthRange {
    var firstValue: Int
    let lenght: Int
}

var rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)

// rangeOfThreeItens 实例包括了名为firstValue的变量存储属性和lenght的常量存储属性
// 其中lenght在创建后无法被修改

rangeOfThreeItens.firstValue = 7;

// rangeOfThreeItens 现在的表示7 8 9的区间

1.1 常量结构体的存储属性

let rangeOfThreeItens = FixedLengthRange(firstValue: 0, lenght: 3)
rangeOfThreeItens.firstValue = 8

1.2延迟存储属性


// DataImporter是一个导入数据的类,导入过程会消耗大量的时间
class DataImporter {
    
    var fileName = "data.text"
    /** 导入数据 **/
}
// DataManager用来管理和提供对这个字符串数组的访问

class DataManager {
    
    lazy var importer = DataImporter()
    var data = [String]()
    /** 管理数据 **/

}

let manager = DataManager()

manager.data.append("someData")
manager.data.append("someMore")

简单描述了一个DataManager类,导入文件的过程。DataManager用来管理数据的导入,依赖与DataImporter的功能。导入数据消耗太多的时间,而且DataManager也可能不导入数据就完成了管理数据的过程。DataImporter不需要立刻创建,只有在使用的时候才去创建。

print(manager.importer.fileName)

只有执行上述代码的时候,DataImporter实例才会被创建。

1.3存储属性和实例变量

2.计算属性

// 下面定义三个结构体,来描述一个矩形
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 * 0.5)
            let centerY = origin.y + (size.height * 0.5)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter){
            origin.x = newCenter.x - (size.width * 0.5)
            origin.y = newCenter.y - (size.height * 0.5)
        }
    }
}
// 创建一个矩形
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: 20.0, y: 20.0)

2.1便捷setter声明


struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point{
        get{
            let centerX = origin.x + (size.width * 0.5)
            let centerY = origin.y + (size.height * 0.5)
            return Point(x: centerX, y: centerY)
        }
        set{
            origin.x = newValue.x - (size.width * 0.5)
            origin.y = newValue.y - (size.height * 0.5)
        }
    }
}

2.2只读计算属性

// 一个结构体 ,volume计算体积
struct Cuboid{
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double{
        return width * height * depth
    }
}

let newCuboid = Cuboid(width: 3.0, height: 4.0, depth: 5.0)

3.属性观察器


// StepCounter是一个计步器
class StepCounter{
    var totalStep: Int = 0{
        willSet(newTotalSteps){
            print("现在总步数是\(newTotalSteps)步")
        }
        didSet{
            if totalStep > oldValue{
                print("增加了\(totalStep - oldValue)步")
            }
        }
    }
}

let stepCounter = StepCounter()
stepCounter.totalStep = 200;
// 现在总步数是200,增加了200步
stepCounter.totalStep = 500;
// 现在总步数是500,增加了300步

4.全局变量和局部变量

全局变量是在函数、方法、闭包或者其他类型之外定义的变量。局部变量是在函数、方法、或者闭包内定义的。

5.类型属性

实例的属性属于一个特定的实例,实例之间的属性相互独立,也可以为类型本身设置属性,不管类有多少的实例,这些属性只有唯一一份,这个就是类型属性。

5.1类型属性语法

在Swift中,类型属性是类型定义的一部分,写在类型最外层花括号内,作用域就是在该类型支持的范围内。

// 只写了只读计算型类型属性
struct MyStruct{

    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
}

enum MyEnum{
    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
    
}
class MyClass {
    static var storedTypeProperty = "Some Value"
    
    static var comutedTypeProperty : Int{
        return 998
    }
    class var overridedableComutedTypeProperty : Int{
        return 100
    }
}

5.2获取和设置类型属性的值

跟实例的属性一样,类型属性可以用点语法来访问,只是不需要通过实例。

上一篇 下一篇

猜你喜欢

热点阅读