Swift之闭包

2023-12-12 01:18
文章标签 swift 之闭

本文主要是介绍Swift之闭包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

swift中闭包是一个很强大的东西,闭包是自包含的函数代码块,可以在代码中被传递和使用。跟C 和 Objective-C 中的代码块(blocks)很相似 。这个大家必须掌握!必须掌握!必须掌握!重要的事情要说三遍

闭包可以捕获和存储其所在上下文中任意常量和变量的引用。 这就是所谓的闭合并包裹着这些常量和变量,俗称闭包。下面我们就来攻克它!

1、闭包函数

官方在讲解闭包函数的时候一般都是使用一个sort() 的排序方法,我们来看看这个例子:

<pre name="code" class="html"><span style="font-size:18px;">let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
func backwards(s1: String, s2: String) Bool {return s1 > s2
}
</span>


 

这里我们定义了一个String 类型的数组,然后定义了一个function,接受两个 接收两个String 类型的参数,返回bool

然后我们来了解下sort() 我们这里对这个数组进行排序 按照我们定义的方法的规则,

var reversed = names.sort(backwards)
这个sort() 在swift 2.0加入数组,成为数组的成员方法可以直接调用 ,这里传入与数组类型相同的两个值 ,并返回bool ,如果返回true 就把第一个参数放在第二个前面 (也就是降序),反之你懂的

所以 ,我们这个函数的意思就是如果第一个比第二个参数大就返回true(s1>s2) ,所以是一个降序的排列 ,这里得到的结果是 :[Ewa, Daniella, Chris, Barry, Alex]

大家看着官方的sort() 也看不到具体的实现,所以这块有可能不是很清楚 ,那么我们自己写一个排序 ,也传入我们这个函数。

<span style="font-size:18px;">
func mySort (var arr:[String] , sortStr:(String,String)->Bool)->[String]
{if(arr.count == 0){ return arr; }let count = arr.countvar temp = ""for i in 0..<count{for j in i+1..<count{if(!sortStr(arr[i],arr[j])){temp = arr[i]arr[i] = arr[j]arr[j] = temp}}}return arr;
}
</span>

这其实就是一个简单的冒泡排序 ,只不过把规则交给调用者 。
调用方法 mySort(names, sortStr: backwards) 这里传入的是一个数组和一个函数类型 。得到结果 :[Ewa, Daniella, Chris, Barry, Alex] 跟官方的sort一样的 。

下面的实例我们就用自己的sort 来讲,代码都在这里。大家可以看得明白 。

这里需要补充一个知识点。

<span style="font-size:18px;">区间运算 :0...n  表示0-n的闭合区间  0..<n 表示一个包含0 不包含n半开半闭</span><span style="font-size:18px;"><a target=_blank target="_blank" name="t2">
</a>2、闭包表达式语法</span>

然而这是一个相当冗长的方式,本质上只是写了一个单表达式函数 (a > b),但是我们还要写一个函数 ? 当然不需要,下面我们用闭合表达式语法可以更好的构造一个内联排序闭包

<span style="font-size:18px;">闭包表达式语法有如下一般形式:
{ (parameters) -> returnType instatements
}
</span>

闭包表达式语法可以使用常量、变量和inout类型作为参数,不提供默认值。 也可以在参数列表的最后使用可变参数。 元组也可以作为参数和返回值。

<span style="font-size:18px;">let arr1 = mySort( (names) , sortStr: { (s1:String,s2:String) -> Bool inreturn s1>s2
})
</span>

这里我们把上面传入函数的地方,我们传入了一个闭包。这里就不做过多解释。完全按照上面的语法类型

  • 根据上下文推断类型

因为我们写的mySort 第二个参数是类型为(String, String) -> Bool的函数,因此实际上String,String和Bool类型并不需要作为闭包表达式定义中的一部分。 因为所有的类型都可以被正确推断,返回箭头 (->) 和围绕在参数周围的括号也可以被省略:

所以我们的可以这样写 :

<span style="font-size:18px;">let arr2 = mySort( (names) , sortStr: { s1,s2 in return s1>s2 })</span>

看到没,智能的swift帮我们把闭包缩短了很多

  • 单表达式闭包隐式返回

单行表达式闭包可以通过隐藏return关键字来隐式返回单行表达式的结果,我们这里是单行表达式 。
注:不要方便的用惯了多行表达式别也给省略了

<span style="font-size:18px;">let arr3 = mySort( (names) , sortStr: { s1,s2 in s1>s2 })</span>

这篇关于Swift之闭包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/482738

相关文章

Swift知识点---RxSwift学习

1. 什么是RxSwift RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发、维护 RxSwift的目的是:让数据/事件流 和 异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程 RxSwift本质上还是观察者模式,并且是一个响应式的,并且可以序列化的 观察者模式 观察者模式包括:KVO、通知等 爸爸妈妈照看观察宝宝 其中,

王立平-- Swift

Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。     Swift已经存在了多年。Apple基于已有的编译器、调试器、框架作为其基础架构。通过ARC(Au

The `XXXUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build......

出现的警告: [!] The `ColorInHeartUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-ColorInHeart-ColorInHeartUITests/Po

swift快捷键大全

1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 CMD + S: 保存 CMD + SHIFT + S: 另存为 CMD + W: 关闭窗口 CMD + SHIFT + W: 关闭文件 2. 编辑 CMD + [: 左缩进 CMD + ]: 右缩进 CMD + CTRL + LEFT: 折叠 CMD + CTRL + RIGHT:

自学Swift之打印输出

所有编程语言都有的函数打印输出: print()         // 不换行输出 println()      // 换行输出       print 和 println 函数可以直接打印基本类型 var num = 10 println("hello " + (String)num)   // 方式1: 其他类型同String输出的时候需要强转 printl

Swift项目#if DEBUG不生效

在新建的iOS项目中 代码里使用#if DEBUG不生效 解决办法: 在Xcode中给项目添加Debug标识符 点击“Build Setting”搜素Swift Compiler - CustomFlags打开Active Compilation Condition添加Debug标记为“DEBUG”

Swift 3.0 学习 -- 大写和小写字符串(Uppercase and Lowercase Strings)

在swift2.0的时候,您可以通过字符串的uppercaseString和lowercaseString属性来访问大写/小写版本的字符串。如下:

Swift 3.0 学习 -- 计算字符数量 (Counting Characters)

在swift2.0的时候,可以通过调用全局countElements函数,并将字符串作为参数进行传递,可以获取该字符串的字符数量。如下: let unusualMenagerie = "Koala, Snail, Penguin, Dromedary"print("unusualMenagerie has \(countElements(unusualMenagerie)) charact

swift 中“?”和“!”区别以及相关用法

最近也在学习swift的只是,已经是学完了闭包的用法,但回头想想之前学的一些知识感觉又望的差不多了。现在自己总结一些swift中?、!和as的相关用法。废话不多说了直接来吧! 一、swift语言使用var定义变量,但和别的语言不同,swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化。如果在使用之前不进行初始化的就会报错:           其

Module compiled with Swift 版本号 cannot be imported by the Swift 版本号 compiler

今天把xcode升级到12.5最新版,然后编译出现下面错误。。。记录下 XCTestWD:Module compiled with Swift 5.3.1 cannot be imported by the Swift 5.4.2 compiler: /Users/liyinchi/TestTool/node-v12.18.3-darwin-x64/lib/node_modules/app-in