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. const函数的使用

    const知道吗?解释其作用. 1.const 修饰类的成员变量,表示成员常量,不能被修改. 2.const修饰函数承诺在本函数内部不会修改类内的数据成员,不会调用其它非 const 成员函数. 3. ...

  2. Error:Failed to resolve: com.afollestad:material-dialogs:

    http://www.chenruixuan.com/archives/1068.html 背景: 同事把Android项目直接考给了我...我在Android Studio上运行,然后提示: Err ...

  3. 连接mysql 2003 Can't connect to Mysql on 'xxx'(10061)

    备份 cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak 修改 vim /etc/mysql/my.cnf 在[mysqld]下修改为bind-address=0.0 ...

  4. HLS协议分析实现与相关开源代码

        苹果定义的HLS协议,广泛运用在现在很多的流媒体服务器和客户端之间,用以传输直播电视数据流.    具体的协议参照    http://tools.ietf.org/html/draft-pa ...

  5. ios之UITextfield (2)

    UItextField通常用于外部数据输入,以实现人机交互.下面以一个简单的登陆界面来讲解UItextField的详细使用. //用来显示“用户名”的label UILabel* label1 = [ ...

  6. More Effective C++ - 章节二 : 操作符(operators)

    5. 对定制的 "类型转换函数" 保持警觉 允许编译器执行隐式类型转换,害处多过好处,不要提供转换函数,除非你确定需要. class foo { foo(int a = 0, in ...

  7. 同一SQL语句在PLSQL Developer与SQL * PLUS工具中执行结果不一致

    背景 今天遇到如下问题,同一sql语句在PLSQL Developer与SQL*PLUS工具中执行结果不一致, sql语句如下 SELECT 'GROUPHEALTH_SEND_EMAIL' as i ...

  8. Week06-继承、多态、抽象类与接口

    Week06-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口,Comparable,interface关键字,Comparator,继承 ...

  9. 如何将表的行数赋值给变量(MySQL)

    delimiter $$ drop procedure if exists test_at $$ create definer=root@localhost procedure test_at() b ...

  10. exports和moudle. exports

    http://zihua.li/2012/03/use-module-exports-or-exports-in-node/ https://github.com/seajs/seajs/issues ...