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的更多相关文章

  1. 学习swift从青铜到王者之swift闭包06

    语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...

  2. 学习swift从青铜到王者之swift结构体和类08

    定义 // 定义类 class StudentC{ } // 定义结构体 struct StudentS{ } 定义存储属性 // 定义类 class StudentC{ var name:Strin ...

  3. 学习swift从青铜到王者之swift枚举07

    空枚举 //空枚举 enum SomeEnumeration { // enumeration definition goes here } 枚举基本类型 //枚举基本类型 enum CompassP ...

  4. 学习swift从青铜到王者之Swift语言函数05

    1.定义一个函数以及调用 //一,定义一个无参无返回值函数 func fun1(){ print("this is first function") } fun1() 2.定义一个 ...

  5. 学习swift从青铜到王者之Swift控制语句04

    1 if语句基本用法 if boolean_expression { /* 如果布尔表达式为真将执行的语句 */ } 如果布尔表达式为 true,则 if 语句内的代码块将被执行.如果布尔表达式为 f ...

  6. 学习swift从青铜到王者之Swift集合数据类型03

    1 数组的定义 var array1 = [,,,] var array2: Array = [,,,] var array3: Array<Int> = [,,,] var array4 ...

  7. 学习swift从青铜到王者之swift基础部分01

    1.1 变量和常量 var 变量名称 = 值(var可以修改) let 常量名称 = 值(let不可以修改) 1.2 基本数据类型 整数类型和小数类型 两种基本数据类型不可以进行隐式转换 var in ...

  8. 学习swift从青铜到王者之字符串和运算符02

    1 字符和字符串初步  var c :Character = "a" 2 构造字符串  let str1 = "hello" let str2 = " ...

  9. 学习Android从青铜到王者之第一天

    1.Android四层架构 一.Linux Kernel 二.Libraries和Android Runtime 三.Application Framework 四.Applications 一.Li ...

随机推荐

  1. leetcode_935. Knight Dialer_动态规划_矩阵快速幂

    https://leetcode.com/problems/knight-dialer/ 在如下图的拨号键盘上,初始在键盘中任意位置,按照国际象棋中骑士(中国象棋中马)的走法走N-1步,能拨出多少种不 ...

  2. example - 在这里插入一句话的简介

    总览 (SYNOPSIS) example [options] arguments 描述 (DESCRIPTION) 在这里插入描述 man9 应当是 “内核文档” 但是由于内核文档一般不以 man ...

  3. dockerfile 的最佳实践

    Dockerfile 编写nginx容器 [root@mast nginx]# cat Dockerfile FROM centos MAINTAINER zhaoruidong RUN yum -y ...

  4. xshell通过xftp传输Windows文件到Linux:在输入put后,再摁 TAB 键,可显示当前文件夹的文件

    在输入put后,再摁 TAB 键,可显示当前文件夹的文件 sftp:/home/yan> put $Recycle.Bin\              BluestacksCN\         ...

  5. windows10家庭版 远程桌面报错

    windows10家庭版 远程桌面报错“要求的函数不受支持 ...”,Windows没有编辑组策略选项(gpedit.msc),所以无法按照微软提供的方法来修改组策略.所以我们需要修改注册表的方法来修 ...

  6. “xxxx”表 - 无法修改表。 不能将值 NULL 插入列 'xxxx'

    问题 向已有表增加字段 执行下面sql,sql执行增加两个字段分别: articleTitle 正标题 [nvarchar](200) articleSubTitle 副标题 [nvarchar](2 ...

  7. vue在传值的时候经常遇到的问题

    在我用vue编写程序的时候,在传值的时候,经常会遇到些问题,像今天遇到了两个问题,在用父传子的方法去传值,当父组件中的要传的数据是for循环出来的或者是列表的时候,你想每次运行的事件,都去传某一行,或 ...

  8. HTML5增加与改良的input元素

    h5中form表单中input新增的属性值 在HTML5中增加了许多新的标签和功能属性,今天我们来看一个Form表单在HTML5中新的使用方法.那么在HTML5中新加入的这个功能与之前咱们使用的功能区 ...

  9. IDM下载器使用方法详解:百度网盘下载,视频会员一网打尽!

    一. IDM的设置 [01]IDM插件与各大浏览器的集成 默认情况下,在成功安装IDM后,直接点击这里的选项,会弹出[常规设置],一般情况下直接保持默认的配置即可,如果你使用的是比较小众的浏览器,你可 ...

  10. 剑指Offer(书):实现单例模式

    题目:设计一个类,我们只能生成该类的一个实例. 生成一个单例模式,有下列几种常用解法. 1.双重检查锁. 当运行在多线程环境中,此方法可以正常实现单例模式. public class Singleto ...