初学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

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章