18.Swift学习之属性与方法
类的属性介绍
- Swift中属性有多种
- 存储属性:存储实例的常量和变量
- 计算属性:通过某种方式计算出来的属性
- 类属性:与整个类自身相关的属性
存储属性
- 存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量
- 可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化
- 下面是存储属性的写法
- age和name都是存储属性,用来记录该学生的年龄和姓名
- chineseScore和mathScore也是存储属性,用来记录该学生的语文分数和数学分数
class Student { // 存储属性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 } // 创建学生对象 let stu = Student() // 给存储属性赋值 stu.age = 10 stu.name = "why" stu.chineseScore = 89.0 stu.mathScore = 98.0
计算属性
- 计算属性并不存储实际的值,而是提供一个
getter
和一个可选的setter
来间接获取和设置其它属性 - 计算属性一般只提供
getter
方法 - 如果只提供
getter
,而不提供setter
,则该计算属性为只读属性,并且可以省略get{}
- 下面是计算属性的写法
- averageScore是计算属性,通过chineseScore和mathScore计算而来的属性
- 在setter方法中有一个newValue变量,是系统指定分配的
class Student { // 存储属性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 // 计算属性 var averageScore : Double { get { return (chineseScore + mathScore) / 2 } // 死循环,在内部又会调用set方法 // newValue是系统分配的变量名,内部存储着新值 set { self.averageScore = newValue } } } // 获取计算属性的值 print(stu.averageScore)
类属性
- 类属性是与类相关联的,而不是与类的实例相关联
- 所有的类和实例都共有一份类属性.因此在某一处修改之后,该类属性就会被修改
- 类属性的设置和修改,需要通过类来完成
- 下面是类属性的写法
- 类属性可以使用
static
来修饰 - courseCount是类属性,用来记录学生有多少门课程
- 类属性可以使用
class Student { // 存储属性 var age : Int = 0 var name : String? var chineseScore : Double = 0.0 var mathScore : Double = 0.0 // 计算属性 var averageScore : Double { return (chineseScore + mathScore) / 2 } // 类属性 static var englishScore:Double = 95.5 } // 设置类属性的值 Student.englishScore = 90.5 // 取出类属性的值 print(Student.englishScore)
懒加载属性
- 苹果的设计思想:希望所有的对象在使用时才真正加载到内存中
- 在OC中我们可以重写get方法来进行懒加载
- Swift用
lazy
关键字可以用于定义某一个属性懒加载 - lazy的作用是只会赋值一次
- 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
懒加载的使用
- 格式
lazy var 变量: 类型 = { 创建变量代码 }()
- 案例
lazy var teacher:[String] = { ()->[String] in return ["Mr Zhang", "Mr Li", "Mr Yang"] }() student.teacher
几种属性的区别
- 存储属性 —— 实实在在存储常量和变量的
- 计算属性 —— 依赖于存储属性,通过计算得出来,它提供getter和setter方法间接访问和设置值
- 类属性 —— 本质是一个全局属性,在类里限定了其作用域,用关键字static修饰
- 懒加载属性 —— 用关键字lazy修饰,必须进行初始化,非实例属性懒加载时在大括号{}后面要加上()
- 全局属性 —— 类外面的属性,作用域全局
- 总结:
- 存储属性,最先被初始化
- 构造方法,仅次于存储属性调用,可以在这里对存储属性进行赋值
- 懒加载属性、类属性、全局属性都是在第一次使用的时候初始化一次,以后调用都不再初始化
- 当懒加载属性是基于一个存储属性计算的时候,切勿使用懒加载属性,采用计算属性
监听属性的改变
- 在OC中我们可以重写set方法来监听属性的改变
- Swift中可以通过属性观察者来监听和响应属性值的变化
- 通常是监听存储属性和类属性的改变.(对于计算属性,不需要定义属性观察者,因为可以在计算属性的setter中直接观察并响应这种值的变化)
- 定义观察者
- willSet:在属性值被存储之前设置。此时新属性值作为一个常量参数被传入。该参数名默认为newValue,可以自定义
- didSet:在新属性值被存储后立即调用。与willSet相同,此时传入的是属性的旧值,默认参数名为oldValue,可以自定义
- willSet与didSet只有在属性改变时才会调用,在初始化时不会去调用这些监听方法
class Student { var name:String?{ // 属性即将改变,还未改变时会调用的方法 // 可以给newValue自定义名称 willSet(new){ print("willSet---") // 在该方法中有一个默认的系统属性newValue,用于存储新值 if let new = new { print(new) } } // 属性值已经改变了,会调用的方法 didSet{ print("didSet---") // 在该方法中有一个默认的系统属性oldValue,用于存储旧值 if let oldValue = oldValue { print(oldValue) } } } } var student = Student() // 在赋值时,监听该属性的改变 student.name = "Zhangsan" student.name = "Lisi"
属性继承与重写
- 属性继承:子类可以继承父类的属性,包括存储属性、计算属性和类型属性,还可以继承父类的属性观察器。
- 属性重写
- 无论继承的是存储属性还是计算属性,子类都可以通过提供getter和setter对属性进行重写
- 可以将一个继承的属性重写为一个读写属性
- 不可以将继承来的读写属性重写为只读属性
- 如果重写时提供了setter方法,一定要提供getter方法
- 属性观察器重写
- 无论父类有没有为该属性添加属性观察器,子类都可以添加属性观察器
- 如果父类已经添加了属性观察器,当属性发生变化时,父类与子类都会得到通知
- 属性观察器不能用于计算属性,只能用于存储属性,因为计算属性在setter里就可以获取到属性的变化
实例方法
- 实例方法属于特定类实例、结构体实例或者枚举实例的函数
- 这里的方法其实就是函数,只不过放在类、结构体和枚举中时称之为方法
self 属性
- 每一个类的实例都隐含一个叫做 self的属性,可以使用 self访问当前类中的属性和方法
class Student { var str = "Hello, playground" func say(info:String) { print(info) } func eat(food:String){ //self指向的是当前类的实例 self.say(info: food) print("吃\(food)") } } var stu = Student() stu.eat(food: "米饭")
值类型在实例方法中修改属性和调用方法
- 值类型默认情况下,不能在实例方法中修改属性
- 不能用self调用其他的函数
- 可以在函数前放一个
mutating
关键字来实现
struct Student { var str = "Hello, playground" mutating func say(info:String) { print(info) self.str = "Hello World" print(self.str) } mutating func eat(food:String){ self.say(info: food) print("吃\(food)") } }
类型方法
- 在函数前使用 static关键字(能在类、结构体中使用)
- 在函数前使用 class关键字(只能在类中使用)
static func play(){ print("play") } class func study(){ print("study") }
class 和 static 总结
- class 和 static 相同点
- 可以修饰方法,static 修饰的方法叫做静态方法,class修饰的叫做类方法
- 都可以修饰计算属性
- class 和 static 不同点
- class 不能修饰存储属性,static 可以修饰存储属性,static修饰的存储属性称为静态变量(常量)
- class 修饰的计算属性可以被重写,static 修饰的不能被重写
- static 修饰的静态方法不能被重写,class 修饰的类方法可以被重写
- class 修饰的类方法被重写时,可以使用static 让方法变为静态方法
- class 修饰的计算属性被重写时,可以使用static 让其变为静态属性,但它的子类就不能被重写了
- class 只能在类中使用,但是static 可以在类,结构体,或者枚举中使用
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kotlin转向谷歌云平台,因此开发人员可以像在Android上一样喜欢它。Kotlin是Android开发者的宠儿语言。
image 【中文翻译在后面】 Android developers love Kotlin. Google can tell us that 27% of the top 1,000 Android apps are built using Kotlin or that developers who are using it have a 97% satisfaction rate and that's great. But we've also had developers tell us in person that they not only love it, but it's also changed how much time they need to spend doing the "boring" part of building an app. That gives them more time to do things like polish the user experience or add small details that make a great app...
- 下一篇
19.Swift学习之构造函数与析构函数
重要说明 本文中提到的构造函数,在很多书中有其他的说法,如构造器,构造方法,初始化,初始函数等 本文中提到的析构函数,在很多书中有其他的说法,如反构造器,析构方法,反初始化,反初始函数等 构造函数的介绍 构造函数用于初始化一个类的实例(创建对象) 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数 如果是继承自NSObject,可以对父类的构造函数进行重写 默认构造函数 在创建类和结构体的实例时必须为所有的存储属性设置一个合适的初始值,如果不是在定义时初始化值,可以在构造函数中赋值 构造函数就像一个没有形式参数的实例方法,使用 init 关键字来写 class Person { var name:String var age:Int var sex:String //1.构造函数没有func修饰 //2.构造函数默认完成调用 不能手动调用 init() { print("被调用") name = "Zhangsan" age = 10 sex = "male" } } var p = Person() p.age p.name...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境