Swift面向对象基础(中)——Swift中的存储属性和计算属性
学习来自《极客学院》
1、存储属性:存储在类、结构体里的变量或者常量
2、分为:实例存储属性、类型存储属性
3、所有的存储属性必须显示的指定初始值,在定义时或者构造器当中指定
4、可选类型的存储属性可以不指定初始值
1 import Foundation 2 3 struct lengthRang { 4 var start:Int 5 //定义常量存储属性,可以不指定初始值 6 let length:Int 7 } 8 //创建结构体的实例变量 9 var len = lengthRang(start: 12, length: 2) 10 println("len的起点为\(len.start),长度为\(len.length)") 11 12 //延迟存储属性:第一次被调用时候才会被计算初始值的属性,用lazy修饰符 13 //当某个实例是一个创建成本比较大的实例的引用的时候,使用延迟存储可以提高程序的性能 14 //延迟存储属性只能被定义成变量,也就是var关键字创建,所以不能用let创建 15 16 //计算属性:就是set和get方法的组合 17 /*语法格式 18 [修饰符] var 计算属性名:属性类型{ 19 get{ 20 } 21 set(形参名){ 22 } 23 } 24 */ 25 26 class User { 27 var first:String = "" 28 var last:String = "" 29 //定义计算属性 30 var fullName:String{ 31 //定义计算属性的getter方法,该方法的返回值由first、last两个存储属性决定 32 get{ 33 return first + "_" + last 34 } 35 //定义计算属性的setter方法 36 set(newValue){ 37 var names = newValue.componentsSeparatedByString("_") 38 self.first = names[0] 39 self.last = names[1] 40 } 41 } 42 init(first:String,last:String){ 43 self.first = first 44 self.last = last 45 } 46 } 47 //创建一个实例 48 let s = User(first: "heyang", last: "hello") 49 println(s.fullName) 50 s.fullName = "何杨_你好" 51 println(s.fullName) 52 //只读属性,则无需set部分,可以省略get和花括号 53 54 55 56 57 //属性观察者 58 /* 59 1.除了延迟存储属性之外的所有存储属性(包括实例存储属性和类型存储属性) 60 2.可通过重载方式为继承得到的属性(包括存储属性和计算属性)添加属性观察者 61 */ 62 //其实属性观察者就是 两个特殊的回调方法 63 /* 64 [修饰符]var 计算属性名:属性类型 = 初始值{ 65 wilSet(newValue){ 66 //属性即将被赋值之前自动调用的方法 67 } 68 didSet(oldValue){ 69 //属性呗赋值完成之后自动调用的方法 70 } 71 } 72 *******参数可以省略********* 73 */ 74 class Person { 75 //定义存储属性 76 var name:String = ""{ 77 willSet{ 78 if(count(newValue)>6) || (count(newValue)<2){ 79 println("您设置的人名字\(newValue)不符合要求,请重新设置") 80 }else{ 81 println("人名符合要求,设置成功") 82 } 83 } 84 didSet{ 85 println("人名设置完成,被修改的原名为:\(oldValue)") 86 } 87 } 88 var age:Int = 0{ 89 willSet{ 90 if newValue>100 || newValue<0{ 91 println("您设置的年龄\(newValue)不符合要求,请重新设置!") 92 } 93 else{ 94 println("年龄设置符合要求,设置成功。") 95 } 96 } 97 didSet{ 98 println("年龄设置完成,被修改的年龄为\(oldValue)") 99 } 100 } 101 } 102 //然后是创建实例 103 var p = Person() 104 p.name = "张三" 105 p.age = 21 106 println("\(p.name)")
运行结果: