IOS系列swift语言之课时三
今天需要掌握的内容就是:闭包、类、结构体、属性(计算属性和延迟属性)
同样里面有一些题目,有兴趣的可以做一下.
首先我们需要知道什么是闭包?所谓的闭包就是一个代码块(一般是指函数以及被它捕获的成员变量和对象等)
其次我们需要掌握如何定义类和结构体,和我们学习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语言之课时三的更多相关文章
- IOS系列swift语言之课时二
今天我们要讲的就是函数[对于函数,在最后面还有几道题,喜欢的博友可以看了自己做一下,和我交流一下] 当然这与我们的c语言还是有一定的共同之处的,对于有一些c语言或者是java基础的童鞋,我觉得是很容易 ...
- IOS系列swift语言之课时八
这节课需要讲的就是可选链,内存管理,引用计数,unowned解决 //: Playground - noun: a place where people can play import UIKit / ...
- IOS系列swift语言之课时七
这下需要掌握的就是类型转换,类的构造器,判断类型,异常,异常的处理,defer,范型,约束加速刷代码 import Foundation /* 类型转换 1.利用类的构造器进行转换 2.系统可能提供一 ...
- IOS系列swift语言之课时六
这节课需要讲的就是协议,方法,委托模式(依赖倒转) 代码刷起中...... // // main.swift // ExAndProtocol // // Created by David on 23 ...
- IOS系列swift语言之课时五
过了几天没来理博客了,这次我们要讲的有:类,属性,初始化init(),初始化器,构造器等 直接刷代码了....... //: Playground - noun: a place where peop ...
- IOS系列swift语言之课时四
今天我们要讲的主要有:下标.可为空的类型.枚举(特殊的枚举:递归枚举).原生值.关联值 首先来分析一下这个下标,就是说我们可以通过下标找到对应的值或者是改变对应的值. 其次是可为空的类型,我们要牢记所 ...
- iOS之Swift语言的学习
好久都没有来这个熟悉而又陌生的地方啦, 想想已经有两三个月了吧,不过我相信以后还是会经常来的啦,因为忙碌的学习已经过去啦,剩下的就是要好好的总结好好的复习了,好好的熟悉下我们之前学习的知识点,将他们有 ...
- 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...
- iOS使用Swift语言检查并提示更新
项目要上线了,产品要求跟安卓一样,一进去有一个提示框提示更新.虽然苹果在 Settings/iTunes Store & App Store 选项中有自动更新这一选项,而且添加版本号等等有被拒 ...
随机推荐
- MyEclipse运行前自动保存
MyEclipse中又一坑人设置.运行编译好的代码,如果不手动保存的话,MyEclipse是不会自动保存的.所以,在运行前如果对代码做了修改,运行的依然是上一次的结果. 修改这个反人类设置步骤如下: ...
- MVC 访问IFrame页面Session过期后跳转到登录页面
Web端开发时,用户登录后往往会通过Session来保存用户信息,Session存放在服务器,当用户长时间不操作的时候,我们会希望服务器保存的Session过期,这个时候,因为Session中的用户信 ...
- Python基础篇【第5篇】: Python内置模块(二)
内置模块 1. OS os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell ...
- day9-协程
生产者和消费者模型: #!/usr/bin/env python #coding:utf8 import threading,Queue import time import random def p ...
- XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端
XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端 源起一个App项目,Web服务器就一台,已经装了 ...
- 压测如何观测jvm,就是使用jmx来实现jvm监控
jps.jstack.jmap.jhat.jstat.hprof 基于jmx可以开发web版本,方便压测的时候观测jvm以及线程的信息 ================================ ...
- flash的读写与擦除
对于flash的认识,比较肤浅,在网上找了些资料,感谢 http://blog.csdn.net/lin364812726/article/details/18815395 的博主, 将其博文转载过 ...
- map,hash_map, hash_table, 红黑树 的原理和使用
在刷算法题的时候总是碰到好多题,号称可以用hash table来解题.然后就蒙圈了. 1.首先,map和hash_map的区别和使用: (1)map底层用红黑树实现,hash_map底层用hash_t ...
- qt 工具下的dump工具导出文档出现异常解决方案
今天一直认为qt环境下的dumpcpp 和dumpdoc两个导出工具很好用,可以今天在导出MSChart组件的类方法文档时,虽然导出成功了,但是导出的结果却是令人失望.自己也不知道如何能够正确导出,就 ...
- gulp.js基础入门
安装 Node 去 nodejs.org 根据系统选择性按照教程安装Node. 创建项目 创建项目文件夹 进入项目文件夹 初始化项目 使用npm命令:npm init,根据提示完成. 安装 Gulp ...