簡體   English   中英

Swift`in` 關鍵字的含義?

[英]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 made xs.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM