Swift:面向对象(属性)

Swift中属性的用法比objective-c中属性的用法丰富了很多。下面我逐一介绍。

一、 存储属性 和 延迟存储属性

Demo如下:

class Dog {
    var name = "旺财"
    init(){
        println("狗被初始化了")
    }
}

class Person {
    let age = 20
    var name = "Jack"
    var height = 0.0

    lazy var dog = Dog()
}

var p = Person()
p.dog

代码中,定义了Dog和Person两个类。

1. Dog中的name属性和Person中的age,name,height均为存储属性,用来存储对象的普通属性值。

2. Person中的dog属性,它也是存储属性,只不过它的属性值是Dog对象,而dog属性前面又有了lazy关键字修饰,它就成为了延迟存储属性。

3. 延迟存储属性:第一次用到的时候才初始化,不能作用于常量上面,一般作用于对象上面。上面代码 var p = Person()执行完毕后,dog属性并没有被初始化。当执行完p.dog后,dog才被初始化一个Dog对象。

二、 计算属性

Swift中的计算属性,很类似与C#中的get;set;属性。

Demo如下(计算正方形周长);

class Square {
    var width: Double = 10
    var grith: Double {
        get{
            return width * 4
        }
        set{
            width = newValue / 4
        }
    }
}

var s = Square()
s.width         // 10
s.grith     		// 40
s.grith = 100   // width : 25

上例中,width表示正方形的边长,它是存储属性;而grith表示正方形的周长,它是计算属性;而grith这个计算属性中有get和set两个方法,get表示根据边长可以计算出周长;而set表示根据周长可以计算出边长。需要说明的是set方法中的newValue就是外界赋值给girth传递过来的值,比如上面的s.grith = 100 执行后,newValue的值就是100;而这个newValue值是系统默认的变量,我们也可以自己定义变量,如下:

class Square {
    var width: Double = 10
    var grith: Double {
        get{
            return width * 4
        }
        set(myValue){
            width = myValue / 4
        }
    }
}

注:存储属性必须对属性进行数据初始化操作(除非使用了构造方法,下一节进行讲解);而计算属性可以借助存储属性进行一些计算操作,而得到最终的结果。

三、 类型属性

类型属性简称类属性。

1. 只能是计算属性。

2. 不管创建多少个实例,这些实例共享一份资源。

class Square {
    class var PI: Double{
        return 3.14
    }
}

println("PI的值:\(Square.PI)")

如上例中,PI就是类型属性,它是用class关键字修饰的。并且调用的时候,直接"类名.属性名" 就可以了。而上述中的类型属性是简写形式,我们也可以写成:

class Square {
    class var PI: Double{
        get{
            return 3.14
        }
    }
}

四、 属性监视器

1. 如果是计算属性,直接在set方法中监听即可,类似于objective-c中的kvo方式监听属性。

2. 如果是存储属性,我们需要使用willSet和didSet进行监视。

Demo如下:

class Square {
    var width: Double = 0.0 {
        willSet{
            println("New Value:\(newValue), Current Value:\(width)")
        }
        didSet{
            println("Old Value:\(oldValue), Current Value:\(width)")
        }
    }
}

var s = Square()
s.width = 100

willSet和didSet在属性初始化过程中不会被调用。当执行到代码s.width = 100 的时候,会触发willSet和didSet这两个方法,最终结果为:

New Value:100.0, Current Value:0.0

Old Value:0.0, Current Value:100.0

五、属性重写

可以将一个继承来的只读属性重写为一个读写属性。

class Animal {
    var speed: Int {
        get {
            return 100
        }
    }
}

class Dog: Animal {
    override var speed: Int {
        get {
            return 300
        }
        set {

        }
    }
}

不可以将一个继承来的读写属性重写为一个只读属性(下面的代码,Dog类会报错)

class Animal {
    var speed: Int {
        get {
            return 100
        }
        set {

        }
    }
}

class Dog: Animal {
    override var speed: Int {
        get {
            return 100
        }
    }
}

存储属性的重写(最终属性的值是存储在父类中的)

class Animal {
    var speed: Int = 0 {
        willSet {
            println("Animal - willSet")
        }
        didSet {
            println("Animal - didSet")
        }
    }
}

class Dog: Animal {
    override var speed: Int {
        willSet {
            println("Dog - willSet")
        }
        didSet {
            println("Dog - didSet")
        }
    }
}

var d = Dog()
d.speed = 10
最终打印结果
Dog - willSet
Animal - willSet
Animal - didSet
Dog - didSet

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 07:50:32

Swift:面向对象(属性)的相关文章

Swift 面向对象解析(一)

面向对象总体概括: Swift 不仅能够面向过程编程,也能够面向对象编程(OOP).面向对象其实就是“以对象为核心”,把我们的客观世界想着是由一个个对象组成的,面向对象编程则为对象提供了属性和方法,属性就是为了描述对象的一些状态,方法则是告诉你对象该做什么.面向对象和核心就是“类”和“对象”!在我刚接触编程的时候,其实我也很容易把这东西混淆了,你要也是刚接触编程,能帮到你的,我觉得反而是时间.你要实在是有点难理解,就别去钻牛角尖,也许明天因为某个东西你就会恍然大悟.超喜欢那种感觉! 面向对象的三

数据结构(八) AOV网的关键路径(Swift面向对象版)

上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的,但是工期不是最优的.因为拓扑序列是一个串行序列,如果按照该序列执行项目,那么就是串行执行的.我们知道在一个项目中的一些子工程是可以并行来完成的,这也就类似我们的多线程.今天我们要解决的问题就是找出一个关键路径,是工期最优并保证工程的完成.什么是关键路径,我们在下方会进行详细介绍. 一.关键路径概述 在聊关键路

Swift中属性Properties

1. 相比较于Java,Swift中属性很有意思,有很多分类:存储属性.计算属性和类型属性等等. 2. 存储属性 存储属性:一个存储属性就是存储在特定类或结构体的实例里的一个常量或变量,存储属性可以是变量存储属性(用关键字var定义),也可以是常量存储属性(用关键字let定义). 如果创建了一个结构体的实例并赋值给一个常量,则无法修改实例的任何属性,即使定义了变量存储属性,代码如下: let rangeOfFourItems = FixedLengthRange(firstValue: 0, l

Swift面向对象中类和对象的属性

Swift中类和对象的属性分为三种:储存属性,计算属性和类属性. import Foundation class Person { // 储存属性必须赋初值 var score1: Int = 20 var score2: Int = 50 // 延迟储存属性,需要时再去分配 lazy var dog: Dog = Dog() // 计算属性,不能赋初值,提供get和set方法, var sum: Int { get { return score1 + score2 } } // 类属性,只能是

Swift静态属性

在介绍静态属性之前,我们先来看一个类的设计,有一个Account(银行账户)类,假设它有3个属性:amount(账户金额).interestRate(利率)和owner(账户名).在这3个属性中,amount和owner会因人而异,不同的账户这些内容是不同的,而所有账户的interestRate都是相同的.amount和owner属性与账户个体有关,称为实例属性.interestRate属性与个体无关,或者说是所有账户个体共享的,这种属性称为静态属性或类型属性.3种面向对象类型(结构体.枚举和类

Swift 面向对象解析(二)

接着上面一篇说的内容: 一 继承: 苹果继承与水果,苹果是水果的子类,则苹果是一种特殊的水果:这就是继承的关系,这个我们学OC的时候相信也都理解了,就不再描述定义了,下面的就叫继承: class ZXMessageCell: UITableViewCell { // 自定义的cell继承与UITableviewCell } 继承了父类,你也就能使用父类的属性方法,这些我们学OC的时候也都清楚.看下面几点, 1:重写父类的方法 2:重写父类的属性 3:重写属性观察者    上面的 1 2 3 只要

ios开发中的Swift面向对象

iOS在现代计算机语言中,面向对象是非常重要的特性,Swift语言也提供了面向对象的支持.而且在Swift语言中,不仅类具有面向对象特性,结构体和枚举也都具有面向对象特性. 1.Swift中的类和结构体 Swift中的类和结构体定义的语法也是非常相似的.我们可以使用class关键词定义类,下面我们定义一个Person类,分别包含年龄和姓名属性. import UIKit class JRPerson: NSObject {} 我们发现现在类的定义和之前OC定义有了很大的不同,对于之前的.m文件和

Swift存储属性

类是由属性和方法组成,属性一般是访问数据成员,在Object-C中,属性是为了访问封装后的数据成员而设计,属性本身不存储数据,数据是由数据成员存储的,而Swift中的属性分为存储属性和计算属性,存储属性就是Object-C中的数据成员,计算属性不存储数据,但可以通过计算其他属性返回值 存储属性可以存储数据,分为常量属性和变量属性 存储属性适用于类和结构体两种面向对象结构类型,枚举属性没有存储属性 1.存储属性概念 class Employee{          let no:Int = 0  

Swift计算属性

一.计算属性的概念 计算属性本身不存储数据,而是从其它存储属性中计算得到数据,与存储属性不同,类.结构体.和枚举都可以定义计算属性 计算属性提供了一个getter来获取值,以及一个可选的setter来间接设置其它属性或变量的值,计算属性的语法如下: 面向对象类型 类型名{ 存储属性... var 计算属性名:属性数据类型{ get { return 计算后属性值 } set 新属性值{ } } 示例: class Employee {             var no:Int = 0