[英]Swift `in` keyword meaning?
我想實現從parse.com一些代碼,我注意到一個關鍵字in
后無效。
我難住了這是什么? 你在第二行看到Void in
PFUser.logInWithUsernameInBackground("myname", password:"mypass") {
(user: PFUser?, error: NSError?) -> Void in
if user != nil {
// Do stuff after successful login.
} else {
// The login failed. Check error to see why.
}
}
文檔沒有記錄這一點。 我知道in
關鍵字用於for
循環。
有人確認嗎?
在命名函數中,我們在func
聲明行中聲明參數和返回類型。
func say(s:String)->() {
// body
}
在匿名函數中,沒有func
聲明行 - 它是匿名的! 所以我們在 body 的開頭使用in
line 來代替。
{
(s:String)->() in
// body
}
(這是一個匿名函數的完整形式。但后來斯威夫特有一系列的規則允許返回類型,參數類型,甚至參數名稱和整個in
線在某些情況下被省略。)
*
閉包主體的開始由 in 關鍵字引入。 這個關鍵字表示閉包的參數和返回類型的定義已經完成,閉包的主體即將開始。
*
來源: https : //developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html
目的是什么的問題in
發球已經被這里的其他用戶良好的回答; 總結: in
是 Swift 閉包語法中定義的關鍵字,作為閉包中函數類型和函數體之間的分隔符:
{ /參數和類型/
in
/函數體/ }
但是對於那些可能想知道“但為什么特別是關鍵字in
?”的人來說,Apple 的高級 Swift 編譯器工程師 Joe Groff 在Swift 論壇上分享了一些歷史:
是我的錯,對不起。 在 Swift 的早期,我們有一個與傳統 Javascript 非常相似的閉包語法:
func (arg: -> Type, arg: Type) -> Return { ... }
雖然這是一個很好的常規語法,但如果您試圖支持富有表現力的功能 API,例如集合上的映射/過濾器,或者如果您希望庫能夠提供基於閉包的 API,它當然也非常笨重和笨拙感覺像是語言的擴展。
Apple 最早的采用者對此有所抱怨,並要求我們支持 Ruby 風格的尾隨閉包語法。 這很難適應像 Swift 這樣的 C 風格的語法,我們嘗試了許多不同的迭代,包括字面上的 Ruby 的
{|args| }
{|args| }
語法,但其中許多都存在歧義,或者只是對我們的早期采用者產生反感和反感。 我們想要一些看起來仍然像語言其他部分的東西,但是可以明確地解析,並且可以跨越從完全顯式的函數簽名到極其緊湊的用例的廣度。我們已經將
in
作為關鍵字,我們不能像 Java 那樣使用->
,因為它已經用於表示返回類型,而且我們擔心像 C# 一樣使用=>
會在視覺上過於混亂。in
madexs.map { x in f(x) }
看起來xs.map { x in f(x) }
像for x in xs { f(x) }
,人們討厭它比替代方案少。
*格式化和強調我的。 並感謝Nikita Belov在 Swift 論壇上的帖子幫助我理解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.