学习swift从青铜到王者之swift属性09
1.结构体常量和类常量的存储属性
let p1 = Person1()
//p1.age = 88 不允许修改
//p11.name = "yhx1" 不允许修改 var p11 = Person1()
p11.age =
//p11.name = "yhx1" 不允许改变 class Person2{
let name: String = "yhx"
var age: Int =
}
let p2 = Person2()
//p2.name = "yhx1" 不允许修改
p2.age = var p22 = Person2()
//p22.name = "yhx1" 不允许修改
p22.age =
/*总结:
1.如果你创建一个结构体实例并且把实例赋值给一个常量,你不能够修改这个常量的属性,即使这些属性是变量。
2.这是因为,结构体是值类型,当一个值类型的实例被标记为敞亮的时候,它的所有属性都将是常量。
3.相同的情况对于类却不同,因为类实例是引用类型。如果你把类实例赋值给一个常量的话,你依然可以改变他的变量属性的值。
*/
2.延迟存储属性
/**
(4)延迟存储属性
Swift语言中所有的存储属性必须有初始值,也就是当构造完一个类或者结构体的对象后;
对象中所有的存储属性必须有初始值(这是这个语言要求的),但是也有例外,
其中延迟存储属性可以将属性的初始化向后推迟到该属性第一次被调用的时候。 1.这个属性不适合一开始初始化,取决于外部的很多因素;
2.属性有可能我们从来不用,但是它的初始化又需要较长时间;
必须将延迟存储属性声明成变量(使用var关键字),因为属性的值在实例构造完成之前可能无法得到。
而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。
*/ struct MyStudent {
var name: String
var chinese: Double
var math: Double func showMySelf() -> Void {
print("姓名:\(name), 语文成绩:\(chinese), 数学成绩:\(math)")
}
} class MyClass {
var members:[MyStudent] = []
// 班级里面所有学生的平均成绩
// 按照该语言的特性,这里必须要有一个初始值,但是我们一开始没办法知道平均成绩的值
// 给它一个初始值0,也没有意义,不是真实的成绩。那么这里我们把它设为延迟存储属性lazy。
lazy var score: Double = MyClass().getScore() func getScore() -> Double { print("test lazy property")
var t: Double = 0.0 for i in members {
t += i.chinese
t += i.math
} if members.count > {
return t / Double(members.count)
} else {
return
}
} func show() -> Void {
for i in members {
i.showMySelf()
}
}
} let s0 = MyStudent.init(name: "zhangsan", chinese: 100.0, math: 100.0)
let s1 = MyStudent.init(name: "lisi", chinese: 90.0, math: 90.0) let c0 = MyClass.init()
c0.members.append(s0)
c0.members.append(s1)
c0.show()
//print(c0.getScore()) print("***********************")
// 我们看到打印 test lazy property了
print(c0.score)
3.属性观察器
/**
属性观察器
观察属性的变化,是指属性被修改时可以调用我们事先写好的代码去额外执行一些操作。
类似于OC中的KVO 存在两种属性观察器
1. willSet 在设置新值的时候调用
2. didSet 在设置新值的之后调用
可以直接为除 lazy属性之外的存储属性添加属性观察器,你不可以直接给类里面的计算属性添加属性观察器,
当然也可以在继承类中为父类的计算属性提供属性观察器。
*/
struct MyRect {
var origion:(x: Double, y: Double) = (, ) {
willSet {
// 属性被修改之前
print("will set==\(newValue.x) \(newValue.y)")
} didSet {
// 属性被修改之后
print("did set==\(oldValue.x) \(oldValue.y)")
}
}
var size: (w: Double, h: Double) = (, )
var center: (x: Double, y: Double) = (, )
}
var rect = MyRect()
rect.size = (, )
// 写 内容被修改的时候被调用
rect.origion = (, ) // setter 写
// 这个时候不会调用了
let ddd = rect.origion // getter 读
rect.center = (rect.origion.x + rect.size.w / , rect.origion.y + rect.size.h / )
学习swift从青铜到王者之swift属性09的更多相关文章
- 学习swift从青铜到王者之swift闭包06
语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...
- 学习swift从青铜到王者之swift结构体和类08
定义 // 定义类 class StudentC{ } // 定义结构体 struct StudentS{ } 定义存储属性 // 定义类 class StudentC{ var name:Strin ...
- 学习swift从青铜到王者之swift枚举07
空枚举 //空枚举 enum SomeEnumeration { // enumeration definition goes here } 枚举基本类型 //枚举基本类型 enum CompassP ...
- 学习swift从青铜到王者之Swift语言函数05
1.定义一个函数以及调用 //一,定义一个无参无返回值函数 func fun1(){ print("this is first function") } fun1() 2.定义一个 ...
- 学习swift从青铜到王者之Swift控制语句04
1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...
- 学习swift从青铜到王者之Swift集合数据类型03
1 数组的定义 var array1 = [,,,] var array2: Array = [,,,] var array3: Array<Int> = [,,,] var array4 ...
- 学习swift从青铜到王者之swift基础部分01
1.1 变量和常量 var 变量名称 = 值(var可以修改) let 常量名称 = 值(let不可以修改) 1.2 基本数据类型 整数类型和小数类型 两种基本数据类型不可以进行隐式转换 var in ...
- 学习swift从青铜到王者之字符串和运算符02
1 字符和字符串初步 var c :Character = "a" 2 构造字符串 let str1 = "hello" let str2 = " ...
- 学习Android从青铜到王者之第一天
1.Android四层架构 一.Linux Kernel 二.Libraries和Android Runtime 三.Application Framework 四.Applications 一.Li ...
随机推荐
- PHP中session和cookie的区别
这个话题无论是系统运维还是PHP开发人员面试时会经常遇到,所以这里也进行一些总结和归纳,session和cookie的具体理论网上比较大,大家googel下均可;系统运维注意区分下session(会话 ...
- python基础一day3 字符串
对字符串进行的任何操作都是形成新的字符串. 切片顾头不顾尾 倒着取: 因为顾头不顾尾,所以4要取到 当步长省略时,可以同时省略最后一个冒号 写0时,取不到,什么都不写,可以取到 倒着取出全部的值,两种 ...
- vs2010的资源视图中,对话框显示数字的解决方法之一
以上是不正常显示. 我这次遇到该问题的原因是资源名IDD_DLG_INTENSITY重复定义导致的, 所以在resource.h文件中去除重复定义就好了. 正常应该显示DD_XXX,如下图所示
- python获取指定文件夹下的文件路径
#!/usr/bin/python# -*- coding: UTF-8 -*-# @date: 2018/1/6 23:08# @name: tmp2# @author:vickey-wu impo ...
- Spring上传报错413
SpringMVC上传文件报错413 笔者今天工作时,运维的同事反馈我们上线不久的项目上传文件过大时,总是提示上传失败. 场景重现一下,发现报错信息显示413:Request entity too l ...
- tabs标签页的数据缓存
一进入tabs标签页默认就将所有标签页的数据请求到,并渲染到页面上, 这样如果数据量太大的话会渲染很久, 我的需求就是点击不同的标签时再请求数据,同时对点击过的标签页数据进行缓存,下次点击时不再重新请 ...
- Jvm:性能调优监控工具
现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 .... ...
- hdu 6201 transaction (最短路变形——带负权最长路)
题意: 给定n个城市的货物买卖价格, 然后给定n-1条道路,每条路有不同的路费, 求出从某两个城市买卖一次的最大利润. 利润 = 卖价 - (买价 + 路费) 样例数据, 最近是从第一个点买入, 第4 ...
- Linux常用命令大全 --- 文件备份和压缩命令
在linux中,常用的文件压缩工具有gzip.bzip2.zip . bzip2是最理想的压缩工具,它提供了最大限度的压缩.zip 兼容性好windows也支持 1.bzip2 命令 在shell 提 ...
- ASP.NET Core on K8S学习初探(1)K8S单节点环境搭建
当近期的一个App上线后,发现目前的docker实例(应用服务BFF+中台服务+工具服务)已经很多了,而我司目前没有专业的运维人员,发现运维的成本逐渐开始上来,所以容器编排也就需要提上议程.因此我决定 ...