zoukankan      html  css  js  c++  java
  • IOS系列swift语言之课时三

    今天需要掌握的内容就是:闭包、类、结构体、属性(计算属性和延迟属性)

        同样里面有一些题目,有兴趣的可以做一下.

    首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量和对象等)

    其次我们需要掌握如何定义类和结构体,和我们学习java有什么不同点.

    类的定义

    class 类名{

      //需要定义的属性

    }

    结构体的定义

    struct 结构体名{

      //需要定义的属性

    }

    大家看它们的不同就是一个是class,一个是struts,现在先不揭秘让他们的区别,在代码中,我们将会看到它们的不同.

    我们先来学习闭包:

        在闭包的使用中,我们会先从一个比较齐全的闭包开始,一步一步进行简化.

      1 var str = "Hello, playground"
      2 
      3  
      4 
      5 func outer() -> ()->Void{
      6 
      7     let x = 2
      8 
      9     func inner() {
     10 
     11         print(x)
     12 
     13     }
     14 
     15     return inner
     16 
     17 }
     18 
     19  
     20 
     21 let result = outer()
     22 
     23 result()
     24 
     25 //闭包:一个代码块(一般指的就是函数)以及被它捕获的一些
     26 
     27 //成员(变量,对象等等)
     28 
     29  
     30 
     31 //闭包的种类有三种
     32 
     33 //1.就是一个普通的全局函数,这是一个有名字的闭包。
     34 
     35 //2.内部函数,比如上面的inner,此函数可以捕获它声明的时候所用到的东西
     36 
     37 //3.闭包表达式,类似于c#语言的lambda表达式
     38 
     39  
     40 
     41  
     42 
     43 func outer2 (f: ()->Void) {
     44 
     45     f()
     46 
     47 func outer3 (f: (Int,Int) -> Int) {
     48 
     49     let re = f(1,2)
     50 
     51     print(re)
     52 
     53 }
     54 
     55  
     56 
     57 outer3(f: {(a: Int, b: Int) in
     58 
     59     print("test...")
     60 
     61     return a + b
     62 
     63 })
     64 
     65 //闭包的语法:闭包等价于创建了一个匿名函数
     66 
     67 //格式:{(参数名: 类型,参数名: 类型) in  }
     68 
     69  
     70 
     71  
     72 
     73 let arr = [1,19,6,8,33]
     74 
     75  
     76 
     77 //最完整的闭包写法
     78 
     79 //let filtered = arr.sorted(by: {(a: Int,b: Int) in
     80 
     81 //
     82 
     83 //    return a < b
     84 
     85 //})
     86 
     87  
     88 
     89 //类型可以依据sorted方法的声明,推断出来,所以可以省略
     90 
     91 //let filtered = arr.sorted(by: {(a ,b ) in
     92 
     93 //    
     94 
     95 //    return a < b
     96 
     97 //})
     98 
     99  
    100 
    101  
    102 
    103 //因为只有一行代码,自动把此行代码的结果返回出去,所以可以去掉return
    104 
    105 //let filtered = arr.sorted(by: {(a ,b ) in
    106 
    107 //   // print("sfda")
    108 
    109 //    a < b
    110 
    111 //})
    112 
    113  
    114 
    115 //因为swift自动提供隐含的变量名,以$0开始,所以
    116 
    117 //参数可以去掉,因为参数去掉in就没意义,所以in也可以去掉
    118 
    119 //let filtered = arr.sorted(by: {  $0 < $1})
    120 
    121  
    122 
    123 //因为sorted方法只有一个参数,而且是函数类型的参数
    124 
    125 //所以可以把闭包写在小括号的外面
    126 
    127 //let filtered = arr.sorted(by:){  $0 < $1}
    128 
    129  
    130 
    131 //因为只有一个参数
    132 
    133 let filtered = arr.sorted{  $0 < $1}
    134 
    135 filtered
    136 
    137  
    138 
    139 //swift中的一些符号其实是函数,比如下面的>
    140 
    141 let filtered2 = arr.sorted(by: >)
    142 
    143 print(filtered2)
    144 
    145  
    146 
    147 /***  escaping(跳出,逃出)和自动闭包(autoclosure)*/
    148 
    149  
    150 
    151 //自动闭包,就是把表达式自动转换为闭包
    152 
    153 //有前提:函数的声明不能有参数,但必须有返回值,返回值的类型,没有要求
    154 
    155 func outer3(f: @autoclosure   ()-> Int ) {
    156 
    157     let s = f()
    158 
    159     print(s)
    160 
    161 }
    162 
    163 outer3(f: 555)
    164 
    165  
    166 
    167 //escaping : 函数传递进去时,没有使用,需要加escaping
    168 
    169 var farr = [()-> Void]()
    170 
    171 func  outer4(f: @escaping () -> Void ) {
    172 
    173     farr.append(f)
    174 
    175 }
    176 
    177 outer4(f: {print("escaping....")})
    178 
    179 farr.first?()
    180 
    181  
    182 
    183 //可以这样理解:闭包就是一个函数的替代,简化一些方法的使用
    184 
    185  
    186 
    187  

    接下来就是类和结构体的讲解

     1 /********类与结构********************/
     2 
     3  
     4 
     5 class SomeClass {
     6 
     7     let a = 5 //存储属性
     8 
     9     var b = 6
    10 
    11 }
    12 
    13 struct SomeStruct {
    14 
    15     let a = 5
    16 
    17     var b = 6
    18 
    19 }
    20 
    21  let lei = SomeClass()
    22 
    23 //不行:lei = SomeClass()
    24 
    25 //lei.a = 333 不能改
    26 
    27 lei.b = 444
    28 
    29 let jiegou = SomeStruct()
    30 
    31 //jiegou.a = 5555
    32 
    33 //jiegou.b = 6666 //a,b 都不能改变值
    34 
    35 //a,b不能修改原因就是结构是一个值类型
    36 
    37  
    38 
    39 var jiegou2 = SomeStruct()
    40 
    41 //jiegou2.a = 222
    42 
    43 jiegou2.b = 333
    44 
    45 jiegou2.b
    46 
    47 /*
    48 
    49  类与结构:
    50 
    51  1.类是引用类型,结构是值类型
    52 
    53  2.类可以继承,结构不能
    54 
    55  
    56 
    57  什么时候用结构?
    58 
    59  1.你的类型,如果只是一些数据的封装,那么可以考虑用结构
    60 
    61  
    62 
    63  用结构的案例:
    64 
    65  矩形:长,宽
    66 
    67  地址:家庭地址,办公地址
    68 
    69  */

     最后面就是属性

      1 /************* 属性 ****************/
      2 
      3  
      4 
      5 //存储属性(stored property)
      6 
      7 //class SomeClass2 {
      8 
      9 //    var p1 = 6
     10 
     11 //}
     12 
     13  
     14 
     15 class SomeClass2 {
     16 
     17    var p1 = 6 {
     18 
     19       willSet {
     20 
     21          print("before(newValue)")
     22 
     23       }
     24 
     25       didSet {
     26 
     27            print("after(oldValue)")
     28 
     29        }
     30 
     31       
     32 
     33   }
     34 
     35 }
     36 
     37 let ins = SomeClass2()
     38 
     39 ins.p1 = 8
     40 
     41 //计算属性
     42 
     43  class SomeClass2 {
     44 
     45     var other =  0
     46 
     47     var p: Int {
     48 
     49         get {
     50 
     51             return other
     52 
     53         }
     54 
     55         set {
     56 
     57             other = newValue
     58 
     59         }
     60 
     61     }  
     62 
     63     //在swift中不能有只写(只有set)
     64 
     65     //可以有只读属性,此时可以省略掉get{}
     66 
     67     var p1: Int {
     68 
     69         print("asdf")
     70 
     71            return 888
     72 
     73     }//p1 end
     74 
     75 }
     76 
     77  //属性的demo
     78 
     79 class Person  {
     80 
     81     var name = ""
     82 
     83     var _age = 0
     84 
     85     var chengnianren = false
     86 
     87     var age: Int {
     88 
     89         get{
     90 
     91             return _age
     92 
     93         }
     94 
     95         set {
     96 
     97             if newValue >= 18 {
     98 
     99                 chengnianren = true
    100 
    101             } else {
    102 
    103                 chengnianren  = false
    104 
    105             }
    106 
    107             _age = newValue       
    108 
    109         }
    110 
    111     }
    112 
    113 }
    114 
    115 let p = Person()
    116 
    117 p.age = 20
    118 
    119 p.chengnianren
    120 
    121 p.age = 16
    122 
    123 p.chengnianren
    124 
    125 //*********** 延迟属性 **************** 
    126 
    127 class A {    
    128 
    129     init() {
    130 
    131         print(" a实例化")
    132 
    133     }
    134 
    135 }
    136 
    137 let ains = A()
    138 
    139 class B {
    140 
    141     let name = "cj"
    142 
    143     lazy var lazyp = A()
    144 
    145 }
    146 
    147 let bins = B()
    148 
    149 bins.name
    150 
    151 bins.lazyp
    152 
    153 //静态的属性,可以用static与class修饰
    154 
    155 //class不能修饰在存储属性上
    156 
    157 //静态的属性里面只能访问静态的其它成员
    158 
    159 //class修饰的成员是可以被子类所重写的而static修饰的是不能被重写的。
    160 
    161 class C {
    162 
    163     static var sp = 5
    164 
    165     var sp2 = 6
    166 
    167     class var sp3: Int {
    168 
    169         get{
    170 
    171             return 555
    172 
    173         }
    174 
    175         set{
    176 
    177             sp = newValue
    178 
    179         }
    180 
    181     }
    182 
    183 }
    184 
    185 C.sp
    186 
    187 C.sp3 = 23

    闭包还是有点难理解的,但是细细品味就会有不一样的味道,就像红酒一般得细细品.

  • 相关阅读:
    ITIL 4Foundation认证
    Linux服务器安全之 fail2ban的安装与配置
    Linux的常用基础命令
    jQuery源码学习(2):选择器初窥
    jQuery源码学习(1):整体架构
    从字符串拼接看JS优化原则
    理解函数作用域与闭包
    JavaScript DOM节点操作总结
    函数声明与函数表达式、变量提升
    CSS长度单位详解
  • 原文地址:https://www.cnblogs.com/lhh-njq-best/p/6086831.html
Copyright © 2011-2022 走看看