Swift学习(2函数闭包)

函数的定义

1.函数的基础写法

func 函数名(形参列表)->返回值类型

例: func sum(x:int ,y:int) -> int{

return x+y

}

print(sun(x:10,y:50))

2.外部参数的使用,就是在形参前加一个名字,外部参数不会影响函数内部细节,外部参数会让外部调用看起来更加的直观

例:func sum(num1 x:int ,num2 y:int )-> int{

return x+y

}

print(sum(num1:30,num2:40))

使用“_”可以替代不关心的展示方式,常见的还有for循环中”i”如果没有用到的情况向,可以用“_”代替

func sun(_ x:int ,_ y:int )-> int{

return x+y

}

print(sum(30,40))

3.默认值:通过给参数设置默认值,在调用的时候,可以任意组合参数,如果不指定就使用默认值。但是在OC中是不能实现的,需要定义多个函数

例 :func sum(x:int=1,y:int=2)-> int{

return x+y

}

print(sum())

print(sum(x:10,y:10))

print(sum(x:10))

4.无返回值的情况:主要用在闭包

例: func demo() {}

func demo1() ->() {}

func demo2() ->void {}

闭包

1.闭包的定义:类似于OC的block,但是比block应用更广泛

OC中block是匿名的函数

swift中函数是特殊的闭包

1.提前准备好的代码

2.在需要的时候执行

3.可以当做参数传递

例1:OC中是不能实现的函数赋值

func sum(x:int=1,y:int=2)-> int{

return x+y

}

let f = sum

print(f(x:20,y:40))

例2:简单的闭包

没有参数和返回值的函数b1 (此情况下可以省略参数和返回值,包括”in”)

let b1 = {

print(“hello word”)

}

执行闭包

b1()

例3:带参数的闭包

闭包中,参数,返回值,实现代码都是写在{}中

{形参列表->返回值 in 实现代码}

需要用 “in” 来分割定义和实现

let b2 = {

(x:int) ->() in

print(x)

}

b2(100)

例4:带参数和返回值的闭包

let b3 = {

(x:int) -> int in

return x+200

}

print(b3(1111))

2.swift中GCD的使用方法

1.GCD:将任务添加到队列,指定执行任务的函数

2.翻译:队列调度任务(block/闭包),以同步/异步 的方式来执行

例:func loadData() ->(){

DispatchQueue.global().async{

print(“耗时操作 \(Thread.current())”)

DispatchQueue.main.async(execute:{

print(“主线程更新 ui \(Thread.current())”)

})

}

}

3.在异步执行任务,获取结果,通过 block/闭包 回调。 闭包的应用场景和block完全一致

格式定义特点

1.参数 -> 返回值

2. loadData(completion: (result : [String]) ->())     ->   ()  中(completion: (result : [String]) ->())  参数,后面是返回值。

3.completion: (result : [String]) ->()  中   (result : [String])  是参数 后面是返回值

例:func loadData(completion: (result : [String]) ->() ) ->(){

DispatchQueue.global().async{

print(“耗时操作 \(Thread.current())”)

Thread.sleep(forTimeInterval:1.0)

let json = [“头条”,”八卦”,”天气”]

DispatchQueue.main.async(execute:{

print(“主线程更新 ui \(Thread.current())”)

//执行闭包

completion(result: json)

})

}

}

调用

loadData{

(result) in

print(“获取成功 \(result)”)

}

4.尾随闭包:如果函数的最后一个参数是闭包,函数参数可以提前结束,最后一个参数直接使用{}包装闭包的代码(3的例子)

原始的调用方法(按照函数本身编写的结果)

loadData(

completion:{(result)->() in

print(“获取成功 \(result)”)

}

嵌套的尾随闭包是(系统)不会自动提示尾随闭包,例如2中的例子。当然也可以手动删除多余的来再次写成尾随闭包的样式,方便阅读

func loadData() ->(){

DispatchQueue.global().async{

print(“耗时操作 \(Thread.current())”)

DispatchQueue.main.async{

print(“主线程更新 ui \(Thread.current())”)

}

}

}

5.在OC中可以用{} 来区分作用域。但是在swift中是不行的,swift中遇到{}可能会识别为闭包

6.swift中的循环应用:

1.使用OC的方式

weak var weakSelf = self

loadData{

print(weakSelf?.view)

}

细节1:要使用var修饰 不能使用let 。 因为weak可能在运行时被修改。weak指向的对象一旦被释放,会自动设置为nil ,所有不能为let

细节2:?(可选解包)通常用于单纯发送消息,没有计算       !(强行解包) 强行解包必须有值,如果没有会造成崩溃,通常用于计算

2.Swift推荐方法

loadData{

[weak self] in

print(self?.view)

}

[weak self] 表示闭包中所有的self都是若引用,注意解包

3.Swift的一个特殊方法(不建议使用)

loadData{

[unowned self] in

print(self?.view)

}

[unowned self] 表示闭包中所有的都是 assign的,不会强引用。但是对象释放指针地址不会变化,如果对象被释放,继续调用就会造成野指针的问题

7. [weak self ]是闭包整self的弱引用,如果self被释放,会自动设置为nil,与OC中的 __weak等效

[unowned self] 是闭包中的self 的assign的 ,如果self被释放,指针地址保持不变,会出现野指针的错误,与OC中的 __unsafe_unretained 等效

//demo下载地址:https://github.com/fushengit/Learn-Swift

时间: 2024-12-30 00:11:59

Swift学习(2函数闭包)的相关文章

Swift学习笔记 - 函数与闭包

import Foundation //1.函数的定义与调用//以 func 作为前缀,返回箭头 -> 表示函数的返回类型func sayHello(name: String) -> String { let greeting = "Hello " + name + "!" return greeting} println(sayHello("Anna")) //1.1函数的参数与返回值//函数可以有多个输入参数,写在圆括号中,用逗号

Swift学习之函数和简单地控件的创建

 今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的更多,更加的踏实才行,因为我知道我的基础不如别人,目标和动力也和他们不同,看着大家有的说是只要找到工作就好,还有的说只要每个月够花就好,担着真的是大家来这里学习的最终目的吗,如果是这样,真的还不如随便找个工作将就一下,也比这个整天做到这好多了,还交了那么贵得费用,所以何必呢,既然选择了这条路,既然当

Swift学习笔记之闭包

简介 (真的很简) 闭包的完整形态是这个样子的: { (parameters) -> returnType in statements } 写在一行里就是这样: {(parameters) -> (returnType) in statements} 形式 闭包以三种形式存在: 1.全局的函数都是闭包,它们有自己的名字,但是没有捕获任何值. 2.内嵌的函数都是闭包,它们有自己的名字,而且从包含他们的函数里捕获值. 3.闭包表达式都是闭包,它们没有自己的名字,通过轻量级的语法定义并且可以从上下文

Swift 学习笔记 (函数)

函数 函数是一个独立的代码块,用来执行特定的任务.Swift中的函数与Object-C中的函数一样,但是声明与书写的方式不太一样,现在我们就通过几个例子介绍一下Swift中的函数.简单的来说,他与JS中的函数声明有些相像,但是如果有返回值的时候,他们返回值的书写方式又有不同. 先来说一个简单的例子 //greet 函数的名称 //personName:函数的形式参数,可以为多个 用逗号隔开 //->String 函数的返回值类型 如果没有可以不写 func greet(personName:St

Swift 学习- 07 -- 函数

// 函数 // 函数是一段完成特定任务的独立代码片段, 你可以通过给函数命名来标识某个函数的功能, 这个名字可以被用来在需要的时候'调用'这个函数来完成它的任务 // swift 统一的函数语法非常的灵活, 可以用来表示任何函数, 包括从简单的没有参数名字的 C 风格函数, 到复杂的带局部的外部参数 OC 风格函数, 参数可以提供默认值, 以简化函数调用, 参数也可以即当做传入参数, 也当做传出参数,也就是说, 一旦函数执行结束, 传入的参数值会被修改 // 在 swift 中, 每个参数都有

swift学习之函数(一)

函数就是实现某些特定功能的模块板块,通过函数名调用(起函数名最好起的最好可以通过函数名就基本知道这个函数是干嘛的,不要嫌麻烦,可以多写点),可以定义一个或多个参数名,参数类型,然后可以有返回类型,当通过函数名调用("call")函数的时候,我们传递的参数类型要和函数定义的参数类型一致 (一)定义和调用函数 我们定义一个sayHello(_:)的的函数,因为这就是这个函数的功能,传入一个人名,返回的是和这个人打招呼.为了完成这个,我们需要一个String类型的传入参数,叫做personN

swift学习之函数类型

var someInt: Int = 7 Int 就是表示someInt的类型,同理,这个Int也可以换成函数类型,所以也可以像其他类型那样使用函数类型 函数类型主要由三种用途:(一)就是上面说的了 (二)作为参数(三)作为返回类型 再加一个,就是函数也可以嵌套(nested) let math: (Int , Int) -> Int = addTwoInts printMathResult(math, a: 9, b: 9) //printMathResult(math, 9, 9) func

swift学习之函数的参数命名

前面文章我说过,给一个函数起名字最好让人通过名字就大概知道你这个函数的大概功能,而不是让人读完内部代码才知道你的函数是干嘛的,大家都是程序员,你不想下个人接你的代码时问候你XXX啥的吧,这也和规范有一定联系的,这次就说说函数的参数命名把 其实函数参数是有外部命名和本地命名的,外部命名就是针对外部调用函数时所写的名字,本地命名就是指在函数块内用来访问使用的,在我个人理解也是一种补充,这也是我个人更喜欢swift的原因,相当于把长的命名拆分了,外部调用也许你还模棱两可,但是当你看到该函数,发现还有本

swift学习笔记2——函数、闭包

阅读目录 函数 闭包 之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询用.详细可以参考the-swift-programming-language-in-chinese,或者苹果官方英文版文档 当前版本是swift2.2 函数 func sayHello(personName: String, alreadyGreeted: Bool) -> S