swift 闭包

Swift中的闭包,是一个自包含的函数代码块,可以再代码中传递和使用,作为对象来传送,作为函数来使用,类似于OC中的block函数
可以捕获和存储所在上下文中任意的常量和变量的引用,也就是闭合并且包裹着这些常量或变量,俗称为闭包;
在Swift中,会自动管理在捕获过程中涉及到的内存操作;
1、语法
{(参数:参数类型 。。。) ->返回值类型 in
//执行语句
}
2、具体使用:sort函数,是系统提供的一个排序函数,用于对数组中的元素进行排序,但是不会修改原来数组,(仅仅是排序输出)
let name = [“Asd”, “Jkas”, “Fdhk”, “Lsjd”]
//比较大小的排序函数
func prepare(para1: String, para2: String) -> Bool {
return para1 < para2
}
var newNames = names.sort( prepare) //实质上是将自定义的比较函数整个作为参数传给sort函数
3、使用闭包的语法-实现排序
newName = names.sort({ para1: String , para2 : String})-> Bool in {
return para1 < para2
})
4、根据上下文推断类型 - (闭包的简写)
在swift中,系统可以自动的推断参数和返回值的类型
newNames = names.sort({para1, para2 in
return para1 < para2
})
5、单表达式闭包隐试返回 - (闭包的简写)
可以通过隐藏return关键字来达到隐试返回的目的
newNames = names.sort({ para1, para2 in
para1 < para2
})
尾随闭包:(自己去了解)

三、枚举
在C语言中,枚举将枚举名和一个整形的值相对应,但是Swift中,枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举值成员提供一个值,该值得类型可以是:字符串、字符、整形或浮点型。另外,枚举成员可以指定任何类型的相关值存储到枚举成员中;
1、语法,
定义枚举 enum关键字
enum Direction { //枚举名的第一个字母必须大写
case North //case 关键词表明新的一行成员值将被定义。
case West, case East , case South //多个成员值可以出现在同一行上,用逗号隔开
}
【注意:】1、和 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值。在上面的CompassPoints例子中,North,South,East和West不会隐式地赋值为了0,1,2和3。
2、枚举名字(例如CompassPoint和Planet)必须以一个大写字母开头。
2、枚举的使用
var direction = Direction.East;
direction = .South //枚举在被初次初始化之后,获取另外的值时,可以直接使用 “.” 语法调用
3、枚举与Switch语句配合使用
switch direction {
case .North:
case .South:
case .West:
case .east
}
//在判断一个枚举类型的值时,switch语句必须穷举所有情况。如果忽略了.West这种情况,上面那段代码将无法通过编译,因为它没有考虑到CompassPoint的全部成员。强制性全部穷举的要求确保了枚举成员不会被意外遗漏。
//当不需要匹配每个枚举成员的时候,你可以提供一个默认default分支来涵盖所有未明确被提出的枚举成员

四、类和结构体
1、定义:
类的定义:关键字 class
class Person {
var name = “” //定义属性
}
结构体定义:关键字 struct
struct Student {
var name = “” //定义属性
}
2、实例化:
类:Person 类的实例化 : var per = Person()
类的属性赋值:per.name = “墨觞”
print(“姓名:(per.name)”)
结构体:Student 实例化 :var stu = Student()
结构体的属性赋值:stu.name = “夜凰”
print(“姓名:(stu.name)”)
3、类与结构体的混合编程
struct Hand {
var number = 0
}
class Child {
var name = “”
var age = 0
//当类中包含自定义的类时,需要将包含的类型进行初始化
var hands : Hand = Hand() //将 结构体Hand 作为类型标注
}
var child = Child() //实例化Child类
child.name = “夜凰” //给属性赋值
child.age = 5
child.hands.number = 2 //可以直接通过“.语法”就可调用
4、逐一构造器
结构体具有逐一构造器,但是类没有,因为结构体是值类型,类是引用类型
struct Dog {
var name = “”
var age = 0
}
var dog = Dog() //普通实例化
逐一构造器:在实例化结构体的同时,对属性进行赋值。
var dog = Dog(name: “夜凰”, age: 12)
5、值类型
特点:当赋值给变量、常量、或函数时,实质上是 拷贝。
var dog1 = dog //拷贝关系
dog.name = “墨觞” //对原始数据进行更改,不影响被拷贝的类
在 Swift 中,所有的基本类型:整数(Integer)、浮点数(floating-point)、布尔值(Boolean)、字符串(string)、数组(array)和字典(dictionary),都是值类型,并且都是以结构体的形式在后台所实现。
在 Swift 中,所有的结构体和枚举类型都是值类型。这意味着它们的实例,以及实例中所包含的任何值类型属性,在代码中传递的时候都会被复制。
6、引用类型
与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,操作的是做了指针的指向,其并不是拷贝。
class Cat {
var name = “”
var age = 0
}
var cat = Cat()
cat.name = “猫咪”
var cat1 = cat
cat.name = “小猫” //由于不是拷贝关系,原始文件被改变时,新生成的文件也会发生变化

类与结构体的相同点和不同点
相同点:
· 定义属性用于存储值
· 定义方法用于提供功能
· 定义附属脚本用于访问值
· 定义构造器用于生成初始化值
· 通过扩展以增加默认实现的功能
· 实现协议以提供某种标准功能
· 定义方式一样
不同点:
1、关键字不同, 类:class 结构体:struct
2、实例化时,结构体有逐一构造器,类没有
3、结构体是值类型,类是引用类型
联系:可以将结构体作为类型标注在类中使用,(混合编程)

类还有如下的附加功能:
· 继承允许一个类继承另一个类的特征
· 类型转换允许在运行时检查和解释一个类实例的类型
· 解构器允许一个类实例释放任何其所被分配的资源
· 引用计数允许对一个类的多次引用

注意: 结构体总是通过被复制的方式在代码中传递,因此请不要使用引用计数。

7、实例方法和类方法的使用
class Tiger {
var name = “”
var age = 0
//创建实例方法
func eat() {
print(“practice makes perfect”)
self.name = “tiger” //在实例方法中,self表示当前类的对象
}
func run( name: String) {
self.name = name //self可以区分属性和形参
}
//创建类方法 :通过关键字static或者class关键字标明
//在实例方法前面添加关键字,变为类方法
static func bark(){
print(“你好”)
}
}
//如何调用类方法和实例方法
//实例化
var tiger = Tiger()
//调用实例方法,通过对象调用
tiger.eat()
//调用类方法,通过类名直接调用
Tiger.bark()

类方法与实例方法的相同点与不同点
相同点:
1、实质上都是函数
2、都可以对类的属性进行修改
不同点:
1、声明时,类方法使用关键字:static或class ,实例方法不需要
2、调用时,实例方法只能通过类的对象调用,类方法可以通过类名直接调用

8、在值类型(结构体)中,修改属性
strut Student1 {
var number = 100
var grade = 2
//在值类型中,定义实例方法,并在实例方法中修改结构体的属性,需要使用关键字mutating
mutating func study() {
self.number = 60
}
//在实例方法中,直接对self进行修改
mutating func play() {
//使用逐一构造器
self = Student1(number: 20, grade: 5)
}
}
var stu1 = Student1()
stu1.play()
stu1.study()

9、类的继承
class Car{
var carName = “”
var price = 0.0
// 可以在父类的实例方法中,添加final关键字,设置此方法不被子类调用
func run(){
print(“奔跑吧,逗逼”)
}
}
//通过类的继承,子类可以继承父类所有的方法和属性,和OC一样,swift中不允许多继承
class AutoCar: Car {
var factory = “蓝翔”
}
var autoCar = AutoCar()
autoCar.carName = “玛莎拉蒂”
autoCar.price = 0.1
autoCar.run()

class Bicycle : Car {
//在子类中,如果要重写父类方法,需要用 override关键字进行标明
override func run() {
print(“奔跑吧,哈哈”)
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,784评论 1 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 132.转换错误成可选值 通过转换错误成一个可选值,你可以使用 try? 来处理错误。当执行try?表达式时,如果...
    无沣阅读 1,244评论 0 3
  • 1. 闭包 ** 闭包**函数是闭包的一种类似于OC语言中block闭包的表达式(匿名函数)--能够捕获上下文中的...
    高俊阅读 439评论 0 1
  • 最近爱上了摄影,一个人背上相机,到处跑,看到有趣的事物,感动的场景,都想用镜头去记录,把这份美好记下,保存在岁月中...
    有个妞叫小美阅读 192评论 1 2