这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,defer,范型,约束
加速刷代码
1 import Foundation 2 3 /* 类型转换 4 1.利用类的构造器进行转换 5 2.系统可能提供一些特定的类型专门用来进行类型转换 6 3.as? 和as! 7 8 类型判断 is 和=== 9 10 */ 11 12 //let i = 5 13 //let stri = String(i) 14 // 15 //class A { 16 // func am(){ 17 // 18 // } 19 //} 20 //class B: A { 21 // func bm() { 22 // 23 // } 24 //} 25 //class C { 26 // 27 //} 28 // 29 //let ins: A = B() 30 //let insb = ins as? B 31 //let insb2 = ins as! B 32 //insb2.bm() 33 //if insb == nil { 34 // print("faill") 35 //} 36 // 37 //if let z = ins as? B { 38 // 39 //} 40 // 41 //if ins is A { 42 // print("is a ...") 43 //} 44 // 45 //if ins is B { 46 // print("is b") 47 //} 48 // 49 //let ins3 = B() 50 //let ins4 = B() 51 //let ins5 = ins3 52 //if ins3 === ins5 { 53 // print("true...") 54 //} 55 56 //实现了Error接口的类型称之为异常 57 //swift 中一般用枚举类型来实现 58 //enum MyEx: Error { 59 // case Blank 60 // case Length 61 //} 62 //func login(pwd: String) throws -> Bool { 63 // 64 // if pwd.isEmpty { 65 // throw MyEx.Blank 66 // } 67 // if pwd == "abc"{ 68 // return true 69 // } 70 // else { 71 // return false 72 // } 73 //} 74 // 75 // 76 // 77 ////do 78 ////{ 79 //// //调用可能抛出异常的方法,必须加try来调用 80 //// let result = try login(pwd: "") 81 ////} catch MyEx.Blank { 82 //// print("blank....") 83 ////} 84 // 85 // 86 ////do 87 ////{ 88 //// let result = try login(pwd: "") 89 ////} catch { 90 //// print(error) //隐藏的异常对象 91 ////} 92 // 93 ////第二种处理异常的方法,就是不处理,直接抛出 94 //func callThrow() throws { 95 // try login(pwd: "a") 96 //} 97 // 98 // 99 ////Void? 100 ////try? 自己确定不会所调用的方法,不会抛出异常 101 ////也不关心方法返回结果 102 ////let result = try? callThrow() 103 ////if result == nil { 104 //// print("pao") 105 //// 106 ////} 107 //// 108 //// print(result) 109 // 110 ////let result = try! callThrow() 111 ////if result == nil { 112 //// print("pao") 113 //// 114 ////} 115 //// 116 ////print(result) 117 // 118 // 119 ////defer是函数里面最后执行的 120 ////多个defer,其执行顺序与出现的顺序相反 121 ////如果方法抛出了异常,defer仍然不会执行 122 // 123 //func deferDemo() throws{ 124 // print("before") 125 // throw MyEx.Blank 126 // defer { 127 // print("first defer") 128 // } 129 // defer { 130 // print("second defer") 131 // } 132 // print("after") 133 //} 134 //func deferDemo2 (){ 135 // let f: FileHandle 136 // defer { 137 // f.close() 138 // } 139 //} 140 141 //开始使用这种对象的一系列方法 142 // 143 /** 泛型 */ 144 func swapInt(a: inout Int,b: inout Int ) { 145 let temp = a 146 a = b 147 b = temp 148 } 149 var first = 5 150 var second = 6 151 swapInt(a: &first, b: &second) 152 print(first) 153 print(second) 154 155 func swapString(a: inout String,b: inout String ) { 156 let temp = a 157 a = b 158 b = temp 159 } 160 161 var firststr = "a" 162 var secondStr = "b" 163 swapString(a: &firststr, b: &secondStr) 164 165 func swapData<T>(a: inout T,b: inout T) { 166 let temp = a 167 a = b 168 b = temp 169 } 170 171 var doublea = 5.5 172 var doubleb = 6.6 173 let result = swapData(a: &doublea, b: &doubleb) 174 175 176 print(doublea) 177 print(doubleb) 178 179 struct IntStack { 180 var container = [Int]() 181 mutating func push(data: Int) { 182 container.append( data) 183 } 184 185 mutating func pop() ->Int { 186 return container.removeLast() 187 } 188 } 189 190 var mystack = IntStack() 191 mystack.push(data: 1) 192 mystack.push(data: 2) 193 mystack.push(data: 3) 194 print(mystack) 195 mystack.pop() 196 print(mystack) 197 198 199 struct Stack<T> { 200 var items = [T]() 201 202 mutating func push(data: T) { 203 items.append(data) 204 } 205 206 mutating func pop()-> T { 207 return items.removeLast() 208 } 209 } 210 protocol MyC { 211 var data: Int{get set} 212 } 213 class A:MyC { 214 var data:Int = 100 215 } 216 class B:MyC { 217 var data:Int = 200 218 } 219 class C { 220 var data:Int = 300 221 } 222 func sumData<T: MyC>(a: T,b: T) -> Int { 223 let sum = a.data + b.data 224 return sum 225 } 226 //约束的语法:T:父类或接口 227 //多个类型参数之间用逗号,比如T和U 228 func sumData2<T: MyC,U:MyC>(a: T,b: U) -> Int { 229 let sum = a.data + b.data 230 return sum 231 } 232 let ains = A() 233 let bins = B() 234 let cins = C() 235 236 //sumdata,因为2个参数用的是同样的T,意味 237 //着,a和b必须是同样类型的实例,而不能是实现同样接口的不同类型的实例 238 let result22 = sumData(a: ains, b: ains) 239 print(result22) 240 241 let result33 = sumData2(a: ains, b: bins) 242 print(result33) 243 244 //下面因为c没有实现接口,所以不能调用 245 //let result44 = sumData2(a: cins, b: cins) 246 //print(result44) 247 248 249 //利用assocatedType来实现泛型接口的样子 250 protocol Containter { 251 associatedtype XXXX //关联类型 252 func append(data: XXXX) 253 254 } 255 256 257 struct MyContainer<T>: Containter { 258 //typealias XXXX = T 259 func append(data: T) { 260 261 } 262 263 } 264 /* 265 接口中的associatedType有两种作用 266 一种是当成泛型接口的用,比如上面的例子 267 268 还有一种用途,只是在接口中声明一个类型而已 269 在其实现类中,通过typealias把其真正关联中 270 某一个具体的类型 271 */ 272 struct AAA: Containter { 273 // typealias XXXX = Int 274 func append(data: Int) { 275 276 } 277 278 } 279 280 //泛型接口与类的扩展 281 extension Stack { 282 func count() -> Int { 283 return items.count 284 } 285 }