zoukankan      html  css  js  c++  java
  • 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)")

    运行结果:

  • 相关阅读:
    [SinGuLaRiTy] NOIP模拟题 by liu_runda
    [SinGuLaRiTy] NOIP互测模拟赛
    [SinGuLaRiTy] Nescafe 24杯模拟赛
    [SinGuLaRiTy] 复习模板-搜索
    [SinGuLaRiTy] 复习模板-高精度模板
    [SinGuLaRiTy] 复习模板-图论
    [SinGuLaRiTy] 复习模板-数据结构
    [SinGuLaRiTy] 高级搜索算法
    [SinGuLaRiTy] 2017 百度之星程序设计大赛 复赛
    [SinGuLaRiTy] 2017 百度之星程序设计大赛 初赛B
  • 原文地址:https://www.cnblogs.com/goodboy-heyang/p/4651073.html
Copyright © 2011-2022 走看看