Swift 的函數和閉包

函數的關鍵字是 func ,函數定義的格式是:

func funcName(para:paraType) -> returnType{// code
}
復制代碼

函數的參數標簽

其中參數的那部分的詳細結構是用小括號括起來,參數名,冒號,參數類型: (number:Int)。 在默認情況下,函數的參數標簽使用參數名,或者用 _ 不使用參數標簽,也可以自定義標簽,我們定義一個奇葩的函數:

func 求和(數字1 num1:Float, 數字2 num2:Float) -> Float {return num1 + num2
}
復制代碼

求和 就是方法名,數字1 就是自定義的參數標簽。調用時會顯示標簽:

let sum = 求和(數字1: 2, 數字2: 4)
復制代碼

函數返回多個值

swift 還可以用元組返回多個返回值:

func compare(numarray:([Int])) -> (min:Int, max:Int) {var min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max)
}
復制代碼

調用時獲取返回值:

compare(numarray: [1, 2, 3, 4, 5]).max
復制代碼

函數嵌套函數

swift 語法中函數可以嵌套函數,用于分割太長或者太復雜的函數:

// 不要在意邏輯,只是為了示例一下。。。
func sumWithArray(numArray:([Int])) -> Int{var sum = 0func add(num1:Int, num2:Int) -> Int{return num1 + num2}sum = add(num1: numArray[0], num2: numArray[1])return sum
}
復制代碼

返回一個函數

函數還可以用一個函數做為返回值

func makeMethod() -> ((Int)->(Int)) {func addOne(num:Int)->(Int){return num+1}return addOne
}
復制代碼

函數調用:

print("makeMethod()(1993): ",makeMethod()(1993))
// makeMethod()(1993):  1994
/**
makeMethod() 返回的是一個函數,繼續傳入參數 1993,最后返回 1994
*/
復制代碼

傳入一個函數

函數可以把一個函數當做返回值返回,也可以當做一個參數來傳入:

func sumOfMaxMin(numarray:([Int]),compare:(_ numarray:([Int]))->(min:Int, max:Int)) -> (Int) {return compare(numarray).max + compare(numarray).min
}
復制代碼

可以看到, sumOfMaxMin 函數有兩個參數:numarray:([Int])compare:(_ numarray:([Int]))->(min:Int, max:Int) 。其中 compare 是一個函數。

在調用的時候:

var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5],compare: compare)
復制代碼

compare 是上個例子中的函數。當然,我們也可以不傳入一個現成已經定義和實現的函數:

var sumOfMaxMinValue = sumOfMaxMin(numarray: [1, 2, 3, 4, 5]) { (numarray:([Int])) -> (min: Int, max: Int) invar min = numarray[0]var max = numarray[0]for num in numarray {if num > max {max = num}else if num < min{min = num}}return (min, max)
}
復制代碼

函數是一種特殊的閉包

大家伙看到這里,肯定會一拍大腿:哎呦,這玩意不就是閉包嘛!

(The Swift Programming Language)函數實際上是一種特殊的閉包:它是一段能之后被調取的代碼。閉包中的代碼能訪問閉包所建作用域中能得到的變量和函數,即使閉包是在一個不同的作用域被執行的

我們可以使用{}來創建一個匿名閉包。使用in將參數和返回值類型聲明與閉包函數體進行分離。

let numArray:([Int]) = [1, 2, 3, 4, 5] 
var newNumArray:([Int]) = numArray.map({(num:Int) -> Int inlet newNum = num * 3return newNum
})
復制代碼

閉包的簡寫

如果閉包的類型已知,那么可以省略參數和返回值的類型

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num inlet newNum = num * 3return newNum
})
復制代碼

單個語句閉包會把它語句的值當做結果返回

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num innum * 3
})
復制代碼

如果把上面的閉包寫成一行的話

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({num in num * 3})
復制代碼

我們可以通過參數位置而不是參數名字來引用參數,那么上面的代碼就變成這樣

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map({$0 * 3})
復制代碼

當一個閉包是傳給函數的唯一參數,我們可以完全忽略括號

let numArray:([Int]) = [1, 2, 3, 4, 5]
var newNumArray:([Int]) = numArray.map{$0 * 3}
復制代碼

我的博客:iosgg.cn/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391755.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pandas之表格樣式

在juoyter notebook中直接通過df輸出DataFrame時&#xff0c;顯示的樣式為表格樣式&#xff0c;通過sytle可對表格的樣式做一些定制&#xff0c;類似excel的條件格式。 df pd.DataFrame(np.random.rand(5,4),columns[A,B,C,D]) s df.style print(s,type(s)) #<pandas.io.f…

多層感知機 深度神經網絡_使用深度神經網絡和合同感知損失的能源產量預測...

多層感知機 深度神經網絡in collaboration with Hsu Chung Chuan, Lin Min Htoo, and Quah Jia Yong.與許忠傳&#xff0c;林敏濤和華佳勇合作。 1. Introduction1.簡介 Since the early 1990s, several countries, mostly in the European Union and North America, had sta…

ajax跨域

//遠程的地址1.通過header頭實現ajax跨域PHP文件的代碼$origin isset($_SERVER[HTTP_ORIGIN])? $_SERVER[HTTP_ORIGIN] : ; $allow_origin array(http://www.example.com, http://www.example2.com);if(in_array($origin, $allow_origin)){ header(Access-Control-Allow-Ori…

java線程并發庫之--線程同步工具CountDownLatch用法

CountDownLatch&#xff0c;一個同步輔助類&#xff0c;在完成一組正在其他線程中執行的操作之前&#xff0c;它允許一個或多個線程一直等待。 主要方法 public CountDownLatch(int count); public void countDown(); public void await() throws InterruptedException 構造方法…

leetcode 766. 托普利茨矩陣

給你一個 m x n 的矩陣 matrix 。如果這個矩陣是托普利茨矩陣&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 如果矩陣上每一條由左上到右下的對角線上的元素都相同&#xff0c;那么這個矩陣是 托普利茨矩陣 。 輸入&#xff1a;matrix [[1,2,3,4],[5,1,…

藍牙調試工具如何使用_使用此有價值的工具改進您的藍牙項目:第2部分!

藍牙調試工具如何使用This post is originally from www.jaredwolff.com. 這篇文章最初來自www.jaredwolff.com。 This is Part 2 of configuring your own Bluetooth Low Energy Service using a Nordic NRF52 series processor. If you haven’t seen Part 1 go back and ch…

gRPC快速入門記錄

為什么使用grpc 1.protocl buffer一種高效的序列化結構。 2.支持http 2.0標準化協議。 http/2 1.http/2對每個源只需創建一個持久連接&#xff0c;在這一個連接內&#xff0c;可以并行的處理多個請求和響應&#xff0c;而且做到不相互影響。 2.允許客戶端和服務端實現自己的數據…

微服務、分布式、云架構構建電子商務平臺

大型企業分布式微服務云架構服務組件 實現模塊化、微服務化、原子化、灰度發布、持續集成 分布式、微服務、云架構構建電子商務平臺 commonservice eureka Netflix事件、消息總線&#xff0c;用于在集群&#xff08;例如&#xff0c;配置變化事件&#xff09;中傳播狀態變化&am…

使用Matplotlib Numpy Pandas構想泰坦尼克號高潮

Did you know, a novel predicted the Titanic sinking 14 years previously to the actual disaster???您知道嗎&#xff0c;一本小說預言泰坦尼克號在14年前沉沒到了真正的災難中&#xff1f;&#xff1f;&#xff1f; In 1898 (14 years before the Titanic sank), Amer…

spark 架構_深入研究Spark內部和架構

spark 架構by Jayvardhan Reddy通過杰伊瓦爾丹雷迪(Jayvardhan Reddy) 深入研究Spark內部和架構 (Deep-dive into Spark internals and architecture) Apache Spark is an open-source distributed general-purpose cluster-computing framework. A spark application is a JV…

使用faker生成測試數據

需要先安裝faker模塊&#xff0c;pip install faker 導入模塊中的Faker類&#xff1a;from faker import Faker 實例化faker Faker() print(姓名相關) print(姓名:,faker.name()) print(名:,faker.first_name()) print(姓:,faker.last_name()) print(男姓名:,faker.name_male(…

JavaScript中的數組創建

JavaScript中的數組創建 本文轉載自&#xff1a;眾成翻譯 譯者&#xff1a;loveky 鏈接&#xff1a;http://www.zcfy.cc/article/713 原文&#xff1a;http://rainsoft.io/power-up-the-array-creation-in-javascript/ 數組是一個包含了對象或原始類型的有序集合。很難想象一個…

CODEVS——T1519 過路費

http://codevs.cn/problem/1519/ 時間限制: 1 s空間限制: 256000 KB題目等級 : 大師 Master題解查看運行結果題目描述 Description在某個遙遠的國家里&#xff0c;有 n個城市。編號為 1,2,3,…,n。這個國家的政府修建了m 條雙向道路&#xff0c;每條道路連接著兩個城市。政府規…

pca數學推導_PCA背后的統計和數學概念

pca數學推導As I promised in the previous article, Principal Component Analysis (PCA) with Scikit-learn, today, I’ll discuss the mathematics behind the principal component analysis by manually executing the algorithm using the powerful numpy and pandas lib…

pandas之cut

cut( )用來把一組數據分割成離散的區間。 cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise) # x&#xff1a;被切分的數據&#xff0c;必須是一維的 # bins&#xff1a;①int型整數&#xff1a;將x按照數值大小平均分成分…

為Tueri.io構建React圖像優化組件

Let’s face it, image optimization is hard. We want to make it effortless.面對現實吧&#xff0c;圖像優化非常困難。 我們希望毫不費力。 When we set out to build our React Component there were a few problems we wanted to solve:當我們開始構建React組件時&#…

紅黑樹分析

紅黑樹的性質&#xff1a; 性質1&#xff1a;每個節點要么是黑色&#xff0c;要么是紅色。 性質2&#xff1a;根節點是黑色。性質3&#xff1a;每個葉子節點&#xff08;NIL&#xff09;是黑色。性質4&#xff1a;每個紅色節點的兩個子節點一定都是黑色。不能有兩個紅色節點相…

overlay 如何實現跨主機通信?- 每天5分鐘玩轉 Docker 容器技術(52)

上一節我們在 host1 中運行了容器 bbox1&#xff0c;今天將詳細討論 overlay 網絡跨主機通信的原理。 在 host2 中運行容器 bbox2&#xff1a; bbox2 IP 為 10.0.0.3&#xff0c;可以直接 ping bbox1&#xff1a; 可見 overlay 網絡中的容器可以直接通信&#xff0c;同時 docke…

第 132 章 Example

這里介紹一個負載均衡放置問題&#xff0c;我們可以把它擺放在任何位置&#xff0c;每種方案都各有優缺點&#xff0c;需要根據你的實際情況選擇使用 適用于HAProxy / Nginx / LVS 等等 這里用web,db為例子&#xff0c;講述負載均衡之間的關系 132.1. 雙負載均衡的用法 User --…

Python:實現圖片裁剪的兩種方式——Pillow和OpenCV

原文&#xff1a;https://blog.csdn.net/hfutdog/article/details/82351549 在這篇文章里我們聊一下Python實現圖片裁剪的兩種方式&#xff0c;一種利用了Pillow&#xff0c;還有一種利用了OpenCV。兩種方式都需要簡單的幾行代碼&#xff0c;這可能也就是現在Python那么流行的原…