objective c - 論文引用新聞 - 什麼是Swift引用中的下劃線代表?




英文引用格式 (5)

由於Swift 3 默認需要所有參數標籤。

您可以強制IDE使用_隱藏參數標籤。

func foo(a: String) {
}

func foo2(_ a: String) {
}

稱為foo(a: "abc")foo2("abc")

注意:只有在同時( a(外部)參數標籤(內部)變量名稱時,才能使用此參數 。 它相當於 - func foo(aa: String)不會接受_

蘋果為什麼使用它?

您可以看到Apple正在跨API使用它。 Apple的庫仍然使用Objective-C語言編寫(如果不是,它們共享相同的函數名稱,這些名稱是為Objective-C語法設計的)

諸如applicationWillResignActive(_ application: UIApplication)類的函數將具有冗餘參數名稱application ,因為其中已有應用程序的函數名稱。

你的榜樣

func runAction(_ action: SKAction!)會被調用, 而不會_ runAction(action:)那樣標記。 由於函數名稱中已經有一個參數,因此參數名稱action將是多餘的 。 這是目的,為什麼它在那裡。

在Apple文檔的參考部分中,有很多這類事情的實例:

func runAction(_ action : SKAction!)

Objective-C的“等值”是這樣的:

- (void)runAction:(SKAction *) action

它讓我感到(在Swift引用中)在下劃線之後有一個空格,而“action”用斜體書寫。

但我無法弄清楚這是在傳達什麼。 所以也許問題是......有沒有參考文獻中使用的約定的參考?

- 這裡是我在引用下劃線使用時引用的頁面: https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction : https://developer.apple.com/documentation/spritekit/sknode#//apple_ref/occ/instm/SKNode/runAction

更新

Swift 3對如何使用和命名函數/方法參數名稱和參數標籤做了一些更改。 這對這個問題及其答案有影響。 @Rickster在回答關於_underscores的另一個問題方面做得非常出色,這些問題清除了大部分內容,這裡: 為什麼我需要swift中的下劃線?


下劃線是用於指示丟棄值的通用標記。

在這個特定的情況下,它意味著該函數將被調用為runAction(argument)而不是runAction(action:argument)

在其他情況下,它具有其他類似的含義,例如:

for _ in 0..<5 { ... }

這意味著我們只想執行5次塊,我們不關心塊內的索引。

在這種情況下:

let (result, _) = someFunctionThatReturnsATuple()

這意味著我們不關心元組的第二個元素是什麼,只是第一個元素。


參數聲明前面的標識符定義了一個外部參數名稱。 這是調用者在調用函數時必須提供的名稱:

func someFunction(externalParameterName localParameterName: Int)

如果您自己沒有提供外部名稱,則Swift為您定義的任何默認參數提供自動外部名稱。 對於外部參數名稱使用下劃線將從此行為中選擇出來:

在定義參數時,可以通過編寫下劃線( _ )而不是顯式外部名稱來退出此行為。

您可以在這裡閱讀關於此行為的詳細信息,在有關默認值的參數的外部名稱部分。


只是更直觀。

正如你可以看到_只是省略一個本地參數名稱。


我認為這會在Swift中強制一個約定,使它更接近於Objective-c,這更符合可可約定。 在objc中,你沒有(外部)命名你的第一個參數。 相反,按照慣例,您通常在方法名的後半部分包含外部名稱,如下所示:

- (void)myFancyMethodWithFirstName:(NSString *)aFirstName lastName:(NSString *)aLastName;

[someInstance myFancyMethodWithFirstName:@"John" lastName:@"Doe"];

要使Swift api調用與objc一致,您需要禁止第一個參數的外部參數名稱。

func myFancyMethodWithFirstName(_ firstName:String, lastName:String);

someInstance.myFancyMethodWithFirstName("John", lastName:"Doe")




declaration