过了几天没来理博客了,这次我们要讲的有:类,属性,初始化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()