zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    MyBatis(五)动态SQL 之 foreach 标签
    MyBatis(五)动态SQL 之 bind绑定
    MyBatis(五)动态SQL 之 sql 标签(重用片段)
    MyBatis(五)动态SQL 之 choose(when、otherwise)标签
    Interesting Finds: 2008.04.19
    Interesting Finds: 2008.04.15
    Interesting Finds: 2008.04.22
    Interesting Finds: 2008.04.18
    Interesting Finds: 2008.04.17
    Interesting Finds: 2008.04.23
  • 原文地址:https://www.cnblogs.com/lhh-njq-best/p/6117939.html
Copyright © 2011-2022 走看看