iOS开发(Swift)总结21 - 属性

第2部分 故事的进阶要素 - 编程语言Swift的进阶部分

9.属性
9.1 概念通俗讲解
属性这个概念是针对类和结构体而言的,举例说明比较好理解。例如定义一个类:人,我们可以定义这个人的很多属性,例如年龄,身高,体重。抛开类的概念,属性其实就是变量和常量。

1). 在存储的方式上,属性可以分为存储属性和计算属性
(1)存储属性的含义是常量或变量的值存储为实例的一部分。存储属性简单理解的话,存储属性和我们之前讲的普通的常量与变量差不多。
(2)计算属性是通过计算得到一个值,简单理解的话,可以把计算属性理解为一个有返回值的函数。

2). 在使用的范围上,属性可以分为类属性和实例属性
(1)实例属性是特定类型的实例属性。每次创建该类型的新实例时,它都有自己的一组属性值,与任何其他实例不同。
例如我们创建类"人"的实例属性"年龄"。然后创建实例"小王",“小张”,“小王”,“小张"的年龄属性是各自不同的。
(2)类属性是对某个类型的所有实例都可用的值,例如定义一个属性"死亡”。这个属性无论是小王还是小张都会有,此时可以把"死亡"属性定义为类属性。
9.2 定义简洁介绍
定义实现如下

class Person{
    //存储属性的变量,注意:存储属性必须有初始值
    var age = 10
    //计算属性
    var height: Int{
        get{
            return 180
        }
        set(value){
            age = value*2
        }
    }
    
    //实例属性
    var weight = "80KG"
    
    //类属性
    static var isDeath = true
}

上面的定义涵盖了存储属性age,计算属性height,实例属性weight,类属性isDeath
9.3 我的经验总结
1). 存储属性与计算属性
(1)存储属性比较简单,基本把它理解为变量和常量来用就行。
(2)计算属性,把它理解为一个有返回值的函数就行。
对于计算属性,必须有get。set可以没有。例如

var height: Int{
    get{
        return 180
    }
}

如果没有set,代表为只读,也就是说不能改它的值。
例如

class Person{
    var height: Int{
        get{
            return 180
        }
     }
}
var xiaoWang = Person()

如果没有set方法,此时想改height的值是不允许的,例如如下的代码是不允许的

xiaoWang.height = 190

2). 类属性与实例属性
(1)实例属性

var xiaoLi = Person()
xiaoLi.weight = "90KG"

(2)类属性
类属性直接调用类来操作

Person.isDeath = false

对于类属性,除了可以用static关键字,还可以用class关键字
它俩的区别如下
存储属性只能使用static关键字且不能子类重写
计算属性可以用static和class关键字,使用static关键字时子类不能重写,使用class关键字时子类能重写
注:关于类的继承,重写等概念,后面会详细介绍
举例

class Dad{
    //存储属性不能用class关键字,需要用static关键字
    //爸爸是男性
    static var sex = "男"
    //类计算属性如果想要被子类重写,需要使用class关键字。如果没这个需求,写static和class均可
    class var height:Int{
        set{
        }
        get{
            //爸爸身高1米8
            return 180
        }
    }
}
//输出爸爸的性别
print("Dad.sex = \(Dad.sex)")
//输出爸爸的身高
print("Dad.height = \(Dad.height)")

//儿子继承爸爸
class Son : Dad{
    //重写身高,儿子的身高为1米1
    override class var height:Int{
        set{
            
        }
        get{
            return 110
        }
    }

}
 
//输出儿子的性别
print("Son.sex = \(Son.sex)")
//输出儿子的身高
print("Son.b = \(Son.height)")

这里儿子继承了爸爸的属性和方法,然后重写了身高属性,所以这两个输出值是不同的。对于性别属性,因为没有重写所以输出值是一样的。

3). 存储属性,计算属性和实例属性,类属性的关系
存储属性,计算属性两者是互斥的,同理实例属性,类属性也是互斥的。但是存储属性,计算属性和实例属性,类属性并不互斥。一个存储属性可以也是实例属性或类属性,同样一个计算属性可以也是实例属性或类属性。

注:本人水平和能力有限,如果哪些地方写错了,请大家给我反馈,我会及时修改。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值