• 初学swift笔记 结构体(八)


      1 import Foundation
      2 /*
      3 和类很相似
      4 
      5 结构体 -> 封装
      6 属性、方法
      7 结构体是值类型
      8 */
      9 
     10 //定义一个LSQ类型的结构体 关键字struct
     11 struct LSQ {
     12     var Name: String = ""
     13     var Age: Int = 1
     14 }
     15 struct LSQ1 {
     16     var Name: String
     17     var Age: Int
     18 }
     19 struct LSQ2 {
     20     var Name: String
     21     var Age: Int=1
     22 }
     23 
     24 //结构体实例和属性访问
     25 //声明一个变量
     26 var liu : LSQ = LSQ()
     27 var liu1 : LSQ1 = LSQ1(Name: "liuq", Age: 18)
     28 liu.Age=19
     29 liu.Name="zhong"
     30 
     31 liu1.Name="ha"
     32 liu1.Age=20
     33 
     34 println(liu1.Name)
     35 println(liu.Name)
     36 var liu2 : LSQ2 = LSQ2(Name:"AA",Age:1)
     37 println("(liu2.Age):(liu2.Name)")
     38 
     39 //定义带有函数的结构体
     40 struct m_lsq_1 {
     41     
     42     var Name : String = ""
     43     var Age : Int = 1
     44     func getName() -> String {
     45         return Name
     46     }
     47 }
     48 
     49 var temp1 = m_lsq_1(Name: "王建国", Age:30)
     50 println(temp1.getName())
     51 
     52 
     53 //结构体是值类型 不是引用类型
     54 var temp2=temp1
     55 println(temp2.getName())
     56 temp2.Name="TempName"
     57 println(temp2.getName())
     58 
     59 
     60 
     61 /*
     62  63 属性、方法
     64 类是引用类型
     65 
     66 class 类名 {
     67     成员变量
     68     成员方法
     69  70 */
     71 //定义一个类
     72 class m_class_1 {
     73     func m_class_1() {
     74         Name="m_Name"
     75         Age=1
     76     }
     77     var Name : String = ""
     78     var Age : Int = 0
     79 }
     80 //引用类型
     81 var class_1 = m_class_1()
     82 
     83 println(class_1)
     84 
     85 var class_2 = class_1
     86 
     87 println(class_2)
     88 
     89 //当需要判断多个常量或变量是否是同一个实例时 用 === 恒等于  !== 不等于 判断
     90 if class_1 === class_2 {
     91     println("相同")
     92 }
     93 
     94 /*
     95 常量 结构体、枚举 是值类型, 常量不可修改,其属性不可修改
     96 常量 类类型,是引用类型,常量不可修改,其属性可以修改
     97 */
     98 //存储属性
     99 //结构体存储属性
    100 struct person {
    101     var name : String //变量存储属性
    102     let sex : String = "" //常量存储属性
    103 }
    104 
    105 var m_p = person(name: "lsq", sex: "")
    106 //常量属性不可修改
    107 println(m_p.sex)
    108 let m_p_1 = person(name: "t", sex: "n")
    109 //m_p_1.name="lsq" // m_p_1是一个常量,其属性不可修改
    110 
    111 //类存储属性
    112 class c_person {
    113     var name : String = "" //变量存储属性
    114     let sex : String = "" //常量存储属性
    115 }
    116 let c_p = c_person() //c_p 是一个常量,其属性可修改
    117 c_p.name="lsq"
    118 println(c_p.name)
    119 
    120 let c_p1 = c_person()
    121 // c_p = c_p1  //类常量不可修改
    122 
    123 //延迟存储属性
    124 //swift中所有的存储属性必须有初始值,也就是当构造完一个类或结构体对象后,对象中所有的存储属性必须有初始值,但有例外,其中延迟存储属性可以将属性的初始化向后推迟到该属性第一次使用时赋值 关键字lazy
    125 //使用延迟属性:1.属性不适合一开始就初始化,取决于外部对很多因素 2.属性有可能从来都不用,但是它对初始化会需要很长时间
    126 //学生结构体
    127 struct student {
    128     var name : String
    129     var age : Int
    130     func get_name() {
    131         println("我的姓名是:(name)")
    132     }
    133 }
    134 //班级类
    135 class my_class {
    136     var members : [student] = []
    137     lazy var score : Double = self.getScore()  //延迟属性  lazy关键字 score的值是 getScore()结果  当访问score时才去调用方法
    138     //计算平均值
    139     func getScore() -> Double {
    140         var t: Double = 0
    141         for i in members {
    142             t += Double(i.age)
    143         }
    144         if members.count > 0 {
    145             return t / Double(members.count)
    146         }
    147         return 0
    148     }
    149     //显示所有name
    150     func show () {
    151         for i in members {
    152             println(i.name)
    153         }
    154     }
    155     func show_1() {
    156         for i in members {
    157             i.get_name()
    158         }
    159     }
    160     
    161 }
    162 //常规用法
    163 var s1 = student(name: "小明", age: 8)
    164 var s2 = student(name: "小红", age: 10)
    165 var c1 = my_class()
    166 c1.members.append(s1)
    167 c1.members.append(s2)
    168 c1.show()
    169 c1.show_1()
    170 println(c1.getScore())
    171 
    172 //使用延迟属性
    173 var c2 = my_class()
    174 c2.members.append(s1)
    175 c2.members.append(s2)
    176 println(c2.score)
    177 
    178 
    179 /*
    180 计算属性 
    181 1.计算属性不直接存储其值,与存储属性不同,没有任何后端存储与之对应
    182 2.计算属性用于计算,可以实现setter和getter 两种计算方法
    183 3.枚举不可以有存储属性,但是允许有计算属性
    184 对象.属性 = 某值 setter
    185 let value = 对象.属性 getter
    186 个人理解:与c#中的get set 相似,对象存放结果,每次获取结果需要计算
    187 swift中的计算属性,不可以直接存储任何的值。
    188 
    189 只读属性  如果计算属性只提供了get 没有提供set那么该属性是只读属性
    190 */
    191 
    192 struct m_rect {
    193     var origion: (x: Double,y: Double) = (0,0)
    194     var size: (w: Double,h: Double) = (0,0)
    195     //size是计算属性,不能直接赋值,
    196     var center : (x: Double,y: Double) {
    197         get {
    198             //获取的值是重新计算的
    199             return (origion.x + size.w/2 , origion.y + size.h/2)
    200         }
    201         set(n) {
    202             //赋值的时候直接给 origion赋值
    203             origion.x = n.x - size.w/2
    204             origion.y = n.y - size.h/2
    205             //origion.x = n.0 - size.w/2
    206             //origion.y = n.1 - size.h/2
    207         }
    208         /*
    209         当不指定n的时候,默认写法是 newValue 表示要赋的值
    210         set {
    211             //赋值的时候直接给 origion赋值
    212             origion.x = newValue.x - size.w/2
    213             origion.y = newValue.y - size.h/2
    214         }
    215         */
    216     }
    217 }
    218 
    219 var rect = m_rect()
    220 rect.size = (100,100)
    221 println(rect.origion)
    222 rect.center = (12 ,23)
    223 println(rect.origion)
    224 
    225 
    226 /*
    227 计算只读属性
    228 如果计算属性只提供了get 没有提供set那么该属性是只读属性
    229 
    230 */
    231 //学生结构体
    232 struct student_1 {
    233     var name : String
    234     var age : Int
    235     func get_name() {
    236         println("我的姓名是:(name)")
    237     }
    238 }
    239 //班级类
    240 class my_class_1 {
    241     var members : [student_1] = []
    242     lazy var score : Double = self.getsum()  //延迟属性
    243     //计算属性  只读属性  只提供了get方法
    244     var allage : Double {
    245         
    246         get{
    247             return getsum()
    248         }
    249     }
    250     //只读计算属性的简写 省略 get关键字
    251     var allages : Double {
    252             return getsum()
    253       }
    254     func getsum() -> Double {
    255         var t: Double = 0
    256         for i in members {
    257             t += Double(i.age)
    258         }
    259         return t
    260     }
    261     
    262 }
    263 var c3 = my_class_1()
    264 c3.members.append(student_1(name: "小明", age: 8))
    265 c3.members.append(student_1(name: "小红", age: 10))
    266 println(c3.allage)
    267 
    268 
    269 /*
    270     属性观察器
    271 当类中的属性或方法的某个值发生了变化,则调用指定的方法  在OC中称之为KVO 
    272 willSet 修改前被调用
    273 didSet 属性被修改之后调用
    274 相当于注册了两个事件
    275 
    276 */
    277 class my_class_3 {
    278     var t_value : Double = 0{
    279         willSet {
    280             println("WillSet调用:(newValue)")
    281         }
    282         didSet {
    283              println("didSet调用:(oldValue)")
    284         }
    285     }
    286     
    287 }
    288  var m_3 = my_class_3()
    289 m_3.t_value = 1
    290 
    291 //类型属性 可以理解为静态变量
    292 //在结构体中用static关键字修饰 在class类中用class关键字修饰
    293 struct type_property {
    294     var property : Int = 0
    295     //类型属性, 该变量属于当前类的 ,与其他语言中的静态变量相似 不同的是访问该变量时 只能通过类名.出该变量 所有实例化该类的对象共用此变量
    296     static var static_property : Int = 0
    297 }
    298 var obj = type_property()
    299 obj.property = 10
    300 type_property.static_property = 10
     
  • 相关阅读:
    JS 拖动(验证码)滑块
    如何配置WebStorm开发Chrome插件项目
    常用Linux命令备查
    Vim常用快捷键汇总
    常用SQL语句备查
    Maven应用常见问题
    postgresql 关联表修改
    postgis坐标转换
    Geoserver自动发布服务
    GeoServer修改端口号
  • 原文地址:https://www.cnblogs.com/lsqandzy/p/4912803.html
Copyright © 2020-2023  润新知