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. ECharts是我接触过的最优秀的可视化工具,也是进步最快的软件,希望它早日成为世界级的开源项目。

    ECharts的广泛网址: http://echarts.baidu.com/doc/example.html 零编程玩转图表: http://tushuo.baidu.com/?qq-pf-to=p ...

  2. 递归的可视化(Fibonacci)

    递归的可视化 修改递归函数,使其能够显示打印出每次函数递归调用的形参的值. 每一级调用的输出都带有一级缩进,就是使得程序的输出清晰.有趣并且有含义. 思路 以斐波那契数列为例,假设n=5,递归的形参如 ...

  3. log4j.xml 精选的log4j.xml文档,比较详细,网上的版本很多,这个版本相对而言比较完整

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration PUB ...

  4. Ubuntu18.04 NVIDIA显卡驱动 安装大全

    离线安装NVIDIA显卡驱动 费了一天的劲,走了好多的坑,最主要的原因是gcc版本的问题,一定要用最新版本的gcc!!! 1)官网下载显卡驱动 2)apt 下载gcc包及其依赖包,可用apt-cach ...

  5. VS2015安装SVN插件

    一.下载VISUALlSVN 官网下载:地址 选择[VisualSVN for Visual Studio 2015 and older]的下载按钮下载,目前版本号VisualSVN 5.1.9,支持 ...

  6. 网络设置命令--ifconfig.setup

    ifconfig命令 作用:用于显示以及设置当前活动网卡信息 一.  显示当前活动网卡信息 ifconfig 从上面可以看到当前主要有2块活动网卡,eth0:代表当前本地真实网卡 lo:代表回访网卡, ...

  7. 7. ENGINES

    7. ENGINES ENGINES表提供有关存储引擎的信息. 这对于检查是否支持存储引擎或查看默认引擎是什么特别有用. INFORMATION_SCHEMA Name SHOW Name ENGIN ...

  8. git 项目相关

    工具篇:Sourcetree 和 Git Bash Sourcetree Git一款非常好用的可视化工具,方便管理项目.下载地址 https://www.sourcetreeapp.com/ Git ...

  9. git 知识(转)

    转自:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html Workspace:工作区 Index / Stage:暂存区 Repos ...

  10. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...