Swift简明教程(三)-函数与闭包

Swift简明教程(三)-函数与闭包

Swift使用func关键字定义函数,然后与C语言一样使用函数名进行调用,而函数返回值类型用->标示。

<code class="lua hljs" data-origin="" 
func greet(name: String, day: String) -&gt; String {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

<code class="lua hljs" data-origin=""

试验
移除day参数,添加一些别的信息

<code class="lua hljs" data-origin=""

使用元组从函数中返回多个值。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func getGasPrices() -&gt; (Double, Double, Double) {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
Swift的函数可以接受可变参数。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func sumOf(numbers: Int...) -&gt; Int {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }

    return sum
}
sumOf()
sumOf(43, 597, 12)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
试验
编写一个计算参数平均值的函数

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
Swift的函数可以进行嵌套。被嵌套的函数可以访问外面函数定义的变量。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func returnFifteen() -&gt; Int {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}

returnFifteen()

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
Swift中的函数也是基本的数据类型,也就是说可以在一个函数中返回另外一个函数。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func makeIncrementer() -&gt; (Int -&gt; Int) {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }

    return addOne
}

var increment = makeIncrementer()
increment(7)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
函数当然也可以作为其它函数的参数进行传递。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
func hasAnyMatches(list: Int[], condition: Int -&gt; Bool) -&gt; Bool {" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }

    return false
}

func lessThanTen(number: Int) -> Bool {
    return number < 10
}

var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
实际上Swift中的函数是闭包的一个特例。我们可以使用没有名字的{}来定义闭包,而闭包内容与返回值类型之间用in进行分隔。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
numbers.map({" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">numbers.map({
    (number: Int) -> Int in
        let result = 3 * number
        return result
})

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
试验
重写上面的闭包,使得所有的奇数都返回0

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
还有几种方式可以使得闭包的编写更加简洁。当闭包的类型是已知的,比如作为回调或者代理的时候,你可以省略参数类型或者返回值类型。如下:

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
numbers.map({ number in 3 * number })" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">numbers.map({ number in 3 * number })

<code class="lua hljs" data-origin=""

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
在闭包中还可以使用位置来引用参数,这在编写非常短的闭包的时候比较有用。当闭包作为函数的最后一个参数时,可以将它放在函数的圆括号后面。

<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
sort([1, 5, 3, 12, 2]){ $0 &gt; $1 }" style="margin: 0px; padding: 0px; border: 0px; font-size: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(110, 107, 94); font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important;">sort([1, 5, 3, 12, 2]){ $0 > $1 }
<code class="lua hljs" data-origin=""
<code class="lua hljs" data-origin="" 
<code class="lua hljs" data-origin="" 
潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员工程实践者提供系统化的潮汐建模计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值