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)")

运行结果:

 

posted @ 2015-07-16 13:42  何杨  阅读(1207)  评论(0编辑  收藏  举报