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

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

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

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

类的定义

class 类名{

  //需要定义的属性

}

结构体的定义

struct 结构体名{

  //需要定义的属性

}

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

我们先来学习闭包:

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

 var str = "Hello, playground"

 func outer() -> ()->Void{

     let x = 

     func inner() {

         print(x)

     }

     return inner

 }

 let result = outer()

 result()

 //闭包:一个代码块(一般指的就是函数)以及被它捕获的一些

 //成员(变量,对象等等)

 //闭包的种类有三种

 //1.就是一个普通的全局函数,这是一个有名字的闭包。

 //2.内部函数,比如上面的inner,此函数可以捕获它声明的时候所用到的东西

 //3.闭包表达式,类似于c#语言的lambda表达式

 func outer2 (f: ()->Void) {

     f()

 func outer3 (f: (Int,Int) -> Int) {

     let re = f(,)

     print(re)

 }

 outer3(f: {(a: Int, b: Int) in

     print("test...")

     return a + b

 })

 //闭包的语法:闭包等价于创建了一个匿名函数

 //格式:{(参数名: 类型,参数名: 类型) in  }

 let arr = [,,,,]

 //最完整的闭包写法

 //let filtered = arr.sorted(by: {(a: Int,b: Int) in

 //

 //    return a < b

 //})

 //类型可以依据sorted方法的声明,推断出来,所以可以省略

 //let filtered = arr.sorted(by: {(a ,b ) in

 //    

 //    return a < b

 //})

 //因为只有一行代码,自动把此行代码的结果返回出去,所以可以去掉return

 //let filtered = arr.sorted(by: {(a ,b ) in

 //   // print("sfda")

 //    a < b

 //})

 //因为swift自动提供隐含的变量名,以$0开始,所以

 //参数可以去掉,因为参数去掉in就没意义,所以in也可以去掉

 //let filtered = arr.sorted(by: {  $0 < $1})

 //因为sorted方法只有一个参数,而且是函数类型的参数

 //所以可以把闭包写在小括号的外面

 //let filtered = arr.sorted(by:){  $0 < $1}

 //因为只有一个参数

 let filtered = arr.sorted{  $ < $}

 filtered

 //swift中的一些符号其实是函数,比如下面的>

 let filtered2 = arr.sorted(by: >)

 print(filtered2)

 /***  escaping(跳出,逃出)和自动闭包(autoclosure)*/

 //自动闭包,就是把表达式自动转换为闭包

 //有前提:函数的声明不能有参数,但必须有返回值,返回值的类型,没有要求

 func outer3(f: @autoclosure   ()-> Int ) {

     let s = f()

     print(s)

 }

 outer3(f: )

 //escaping : 函数传递进去时,没有使用,需要加escaping

 var farr = [()-> Void]()

 func  outer4(f: @escaping () -> Void ) {

     farr.append(f)

 }

 outer4(f: {print("escaping....")})

 farr.first?()

 //可以这样理解:闭包就是一个函数的替代,简化一些方法的使用

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

 /********类与结构********************/

 class SomeClass {

     let a =  //存储属性

     var b = 

 }

 struct SomeStruct {

     let a = 

     var b = 

 }

  let lei = SomeClass()

 //不行:lei = SomeClass()

 //lei.a = 333 不能改

 lei.b = 

 let jiegou = SomeStruct()

 //jiegou.a = 5555

 //jiegou.b = 6666 //a,b 都不能改变值

 //a,b不能修改原因就是结构是一个值类型

 var jiegou2 = SomeStruct()

 //jiegou2.a = 222

 jiegou2.b = 

 jiegou2.b

 /*

  类与结构:

  1.类是引用类型,结构是值类型

  2.类可以继承,结构不能

  什么时候用结构?

  1.你的类型,如果只是一些数据的封装,那么可以考虑用结构

  用结构的案例:

  矩形:长,宽

  地址:家庭地址,办公地址

  */

最后面就是属性

 /************* 属性 ****************/

 //存储属性(stored property)

 //class SomeClass2 {

 //    var p1 = 6

 //}

 class SomeClass2 {

    var p1 =  {

       willSet {

          print("before\(newValue)")

       }

       didSet {

            print("after\(oldValue)")

        }

   }

 }

 let ins = SomeClass2()

 ins.p1 = 

 //计算属性

  class SomeClass2 {

     var other =  

     var p: Int {

         get {

             return other

         }

         set {

             other = newValue

         }

     }  

     //在swift中不能有只写(只有set)

     //可以有只读属性,此时可以省略掉get{}

     var p1: Int {

         print("asdf")

            return 

     }//p1 end

 }

  //属性的demo

 class Person  {

     var name = ""

     var _age = 

     var chengnianren = false

     var age: Int {

         get{

             return _age

         }

         set {

             if newValue >=  {

                 chengnianren = true

             } else {

                 chengnianren  = false

             }

             _age = newValue       

         }

     }

 }

 let p = Person()

 p.age = 

 p.chengnianren

 p.age = 

 p.chengnianren

 //*********** 延迟属性 **************** 

 class A {    

     init() {

         print(" a实例化")

     }

 }

 let ains = A()

 class B {

     let name = "cj"

     lazy var lazyp = A()

 }

 let bins = B()

 bins.name

 bins.lazyp

 //静态的属性,可以用static与class修饰

 //class不能修饰在存储属性上

 //静态的属性里面只能访问静态的其它成员

 //class修饰的成员是可以被子类所重写的而static修饰的是不能被重写的。

 class C {

     static var sp = 

     var sp2 = 

     class var sp3: Int {

         get{

             return 

         }

         set{

             sp = newValue

         }

     }

 }

 C.sp

 C.sp3 = 

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

IOS系列swift语言之课时三的更多相关文章

  1. IOS系列swift语言之课时二

    今天我们要讲的就是函数[对于函数,在最后面还有几道题,喜欢的博友可以看了自己做一下,和我交流一下] 当然这与我们的c语言还是有一定的共同之处的,对于有一些c语言或者是java基础的童鞋,我觉得是很容易 ...

  2. IOS系列swift语言之课时八

    这节课需要讲的就是可选链,内存管理,引用计数,unowned解决 //: Playground - noun: a place where people can play import UIKit / ...

  3. IOS系列swift语言之课时七

    这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,defer,范型,约束加速刷代码 import Foundation /* 类型转换 1.利用类的构造器进行转换 2.系统可能提供一 ...

  4. IOS系列swift语言之课时六

    这节课需要讲的就是协议,方法,委托模式(依赖倒转) 代码刷起中...... // // main.swift // ExAndProtocol // // Created by David on 23 ...

  5. IOS系列swift语言之课时五

    过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等 直接刷代码了....... //: Playground - noun: a place where peop ...

  6. IOS系列swift语言之课时四

    今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...

  7. iOS之Swift语言的学习

    好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...

  8. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  9. iOS使用Swift语言检查并提示更新

    项目要上线了,产品要求跟安卓一样,一进去有一个提示框提示更新.虽然苹果在 Settings/iTunes Store & App Store 选项中有自动更新这一选项,而且添加版本号等等有被拒 ...

随机推荐

  1. DEDE后台登录和前台验证码不显示的解决方法

    DEDE后台登录和前台验证码不显示的解决方法,网络上现在有好几种方法,某些时候还是有用的.说说自己今天遇到的一个情况,跟其他不一样的原因和解决方法:  方法一 1.用ftp把网站根目录下的DATA文件 ...

  2. java获取配置文件里面的内容

    InputStream in = ReadProperties.class.getClassLoader() .getResourceAsStream("test.properties&qu ...

  3. SQL Server选项综述

    I. 基本概念 SQL Server中的选项根据其作用范围分为如下几类: 实例选项 —— 在数据库实例范围内有效,通过 sp_configure 存储过程进行配置. 数据库选项 —— 在数据库范围内有 ...

  4. PHP常用功能

    1.PHP字符串 字符串声明 变量=''或者""(一般情况会使用单引号,因为写起来会比较方便) $str = 'Hello PHP'; echo $str; strpos 计算字符 ...

  5. 黑马程序员_ Objective-c 之block、protocol学习笔记

    一):block学习总结 block :用来保存一段代码. 1.block 特点:  1> Block封装了一段代码,可以在任何时候执行   2> Block可以作为函数或者函数的返回值, ...

  6. Ejabberd作为推送服务的优化手段

    AVOS Cloud目前还在用Ejabberd做Android的消息推送服务.当时选择Ejabberd,是因为Ejabberd是一个发展很长时间的XMPP实现,并且基于Erlang,设想能在我们自主研 ...

  7. 区分LocalStorage和偏好数据

    偏好数据类似于web.config或者session,cookie之类的值,一般用于保存一些状态值,不推荐大量的数据通过此方式存储 Local Storage不仅可以寸字符串,还可以寸JSON对象

  8. jQuery中关于height,innerWidth与outerWidth的区别

    jQuery width() 和 height() 方法 width() 方法设置或返回元素的宽度(不包括内边距.边框或外边距). height() 方法设置或返回元素的高度(不包括内边距.边框或外边 ...

  9. Android 软引用

    2013-08-13 13:56 佚名 eoe Android开发者社区 字号:T | T   可能对于Android开发者来说,软引用这个词有的会不是很熟悉,软引用在Java开发中用的比较多,但是, ...

  10. Nginx配置文件(nginx.conf)配置详解(2)

    Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目 ...