过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等
直接刷代码了.......
1 //: Playground - noun: a place where people can play 2 3 import UIKit 4 //1.所有的值类型是不能继承的 5 //2.目前为止所有的类型(除了Class)都是值类型 6 // 比如String,数组,字典 7 //3. swift中是单继承 8 //4.官方文档中从来没有说所有类会继承于Object 9 //5.swift目前的版本是没有抽象类,也没有抽象方法 10 //6。重写时注意方法的名字,一定要加override 11 //final:就是阻止被重写 12 //class Parent { 13 // var p = 0 14 // func a(){ 15 // print("parent a ") 16 // } 17 // 18 // //b(first:) 19 // func b(first a: Int) { 20 // 21 // } 22 //// 23 //// //b(second:) 24 //// func b(second a: Int) { 25 //// 26 //// } 27 // 28 // final func c() { 29 // 30 // } 31 //} 32 // 33 //class Child: Parent { 34 // 35 // //父类是一个存储属性,但子类重写成了一个计算属性 36 // //原因是:子类不知道父类的属性到底是存储还是计算属性 37 // // 它只知道属性的名字和类型 38 //// override var p: Int { 39 //// get { 40 //// return 5 41 //// } 42 //// set { 43 //// print("asdfasf") 44 //// } 45 //// 46 //// } 47 // 48 // override var p: Int { 49 // didSet { 50 // print("p didset") 51 // } 52 // } 53 // override func a() { 54 // print("child a ") 55 // } 56 // 57 // 58 // 59 // func b(ss a: Int) { 60 // 61 // } 62 //} 63 // 64 //let ins: Parent = Child() 65 //ins.a() 66 //ins.p = 666 67 //ins.c() 68 69 //**************初始化****************************** 70 //1.初始化是确保一个类型的实例可以使用之前,其所有存储属性都得到正确的赋值 71 //struct FirstStruct { 72 // let a = 0 73 // let b: Int 74 // let c: Int 75 // var cp: Int { 76 // return 5 77 // } 78 //} 79 ////关于结构,编译器会自动帮我们生成memberwise的初始化器 80 // 81 //let fs = FirstStruct(b: 1, c: 2) 82 83 84 /*** 存储属性要么在声明的时候赋值要么就在init中赋值 ***/ 85 struct FirstStruct { 86 let a = 0 87 let b: Int = 6 88 let c: Int 89 init() { 90 // c = 1 91 //在init中可以调用其它的init,但必须加上self 92 //第二个init只能在init中调用 93 self.init(c: 1) 94 95 } 96 init(c: Int) { 97 self.c = c 98 } 99 100 } 101 //let ins = FirstStruct() 102 class Parent { 103 var name: String 104 var height: Int 105 //没有特殊的修饰符的init就是专门的(Designated init)初始化器,主要的作用就是确保 “所有的”存储属性得到初始化 106 //一般只有一个,可以有多个 107 init(name: String,height: Int ) { 108 self.name = name 109 self.height = height 110 } 111 112 //便利初始化器是方便创建对象使用,它必须直接或间接调用专门初始化器 113 convenience init(name: String) { 114 self.init(name: name, height: 175) 115 } 116 convenience init() { 117 self.init(name: "weimingming") 118 } 119 } 120 let p = Parent() 121 p.name 122 p.height 123 //构造器编写的基本套路 124 //1.一般是只写一个专门的初始化器,用来实例化所有的存储属性 125 //2.可以添加任意多个便利初始化器,来直接或间接调用专门的初始化器 126 //3.子类也一般只创建一个专门的初始化器,用来初始化 127 //本类的所有存储属性 128 //4.子类的专门初始化器,必须调用父类的专门初始化器 129 //5.子类的便利初始化器,必须调用(委派,delegate)自己的专门初始化器 130 131 class Child: Parent { 132 var age: Int 133 init(age: Int){ 134 self.age = age 135 super.init(name: "hexin", height: 178) 136 self.name = "xxxx" 137 } 138 139 //子类的便利初始化器,必须委派(delegate)到自己的专门初始化器 140 convenience init() { 141 //self.init(age: 18) 142 143 self.init(age: 18) 144 } 145 } 146 // 147 let c = Child() 148 c.name 149 c.age 150 c.height 151 //小结:1.自己的便利一定要调用自己的专门的初始化器 152 //2.自己的专门初始化一定要调用父类的专门 153 154 155 156 157 /*********** Failable init**/ 158 class Test { 159 var name = "" 160 init?(name: String) { 161 if name.isEmpty { 162 return nil 163 } 164 self.name = name 165 } 166 } 167 168 class Test2: Test { 169 override init(name: String) { 170 171 super.init(name: name)! 172 } 173 } 174 let t = Test(name: " ") 175 if t == nil { 176 print("nil.......") 177 } 178 179 180 //enum Gender { 181 // case male,female 182 // init?(xingbie: String) { 183 // switch xingbie { 184 // case "f": 185 // self = .female 186 // case "m": 187 // self = .male 188 // default: 189 // return nil 190 // } 191 // } 192 //} 193 // 194 //let g = Gender.male 195 //let g2 = Gender(xingbie: "xxx") 196 //if g2 == nil { 197 // print("xxx 不能转换为一个枚举值") 198 //} 199 200 201 enum Gender: String { 202 case Male = "M",Female 203 } 204 205 let g3 = Gender(rawValue: "M") 206 if g3 == nil { 207 print("xxx 不是枚举值") 208 } 209 /* Required init *****/ 210 class Test3 { 211 var name = "" 212 //required表明此初始化器,子类必须重写(但不需要有override)子类也必须加上requried,表明子类的子类也需要重写 213 required init(name: String) { 214 self.name = name 215 print("test3 init...") 216 } 217 } 218 219 class Test4: Test3 { 220 let age : Int 221 init(age: Int) { 222 self.age = age 223 super.init(name: "asfd") 224 } 225 226 required init(name: String) { 227 self.age = 18 228 print("test3 init...") 229 super.init(name: name) 230 } 231 } 232 233 234 let t4 = Test4(age: 55) 235 236 237 class LaJi { 238 var name = "aaa" 239 deinit{ 240 print("清理工作") 241 } 242 } 243 //var lji: LaJi? = LaJi() 244 //lji = nil 245 246 func xx() { 247 let lll = LaJi() 248 lll.name = "bbbb" 249 250 } 251 xx()