IOS系列swift语言之课时七

这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,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 }
原文地址:https://www.cnblogs.com/lhh-njq-best/p/6117939.html