2015-06-16 33 views
42

Dấu gạch dưới đơn lẻ có nghĩa là gì trong định nghĩa hàm?_ là gì: trong Swift nói với tôi?

ví dụ: map(_:)

Tôi hiểu rằng khi xác định các chức năng tôi có thể làm:

func myFunc(_ string: String) { ... } 

Tôi có sau đó tham khảo mà như myFunc(_:) thay vì myFunc(_string:), ví dụ: cố tình giấu tên tham số?

+1

Worth Reading: Swift 3 đã thực hiện một số thay đổi về cách chức năng/phương pháp tên tham số và nhãn lập luận được sử dụng và được đặt tên. Dưới đây là _underscores trong các chức năng với nhiều sự rõ ràng: http://stackoverflow.com/questions/24437388/whats-the-underscore-representative-of-in-swift-references – Niraj

Trả lời

27

Swift cần một quy ước để nói những gì tên của một hàm là, bao gồm không chỉ các tên hàm riêng của mình (trước dấu ngoặc đơn) mà còn những cái tên bên ngoài của các thông số. Quy ước là các tên được theo sau bởi dấu hai chấm. Vì vậy, đây là một khai báo hàm (trong Swift 2.0):

func myFunc(param1 param1:String, param2:String, param3:String) {} 

Và đây là tên của hàm:

myFunc(param1:param2:param3:) 

Trong cuộc sống thực, tuy nhiên, nó có thể (thực sự có khả năng) mà một hoặc nhiều tham số sẽ không từ hóa bất kỳ tên nào. Vì vậy, chúng tôi cần một trình giữ chỗ cho tên đó. Dấu gạch dưới là trình giữ chỗ - giống như dấu gạch dưới là biểu tượng trong khai báo ngăn chặn sự ngoại suy của tên. Vì vậy, đây là một khai báo hàm (trong Swift 2.0):

func myFunc2(param1:String, _ param2:String, _ param3:String) {} 

Và đây là tên của hàm:

myFunc2(_:_:_:) 

[Các Swift 2.0 spec là quan trọng ở đây. Trong Swift 2.0, tên thông số đầu tiên luôn là không phải là được mặc định bên ngoài và các tên param khác được mặc định là. Trong Swift 1.2 và trước đó, các quy tắc bên ngoài phụ thuộc vào nơi khai báo xuất hiện, điều này không nhất quán và khó hiểu một cách không cần thiết.]

+0

Trong khai báo đầu tiên, bạn chưa đặt tên bên ngoài cho tham số thứ hai và thứ ba, cũng như bạn không sử dụng #. Vì vậy, nó nên thực sự được gọi là bạn có, hoặc là nó chính xác bởi vì nó được bên ngoài theo mặc định? - nếu vậy, số # không còn cần thiết nữa? – Alex

+1

@Alex Bạn đã đọc ghi chú ở cuối câu trả lời của tôi chưa? Tôi đang mô tả tình huống cho Swift 2.0. Và '#' đã biến mất trong Swift 2.0. – matt

+0

Tôi đã đọc nó, nhưng đã gây nhầm lẫn bản thân mình cố gắng liên quan 2.0 với 1,2, khi tôi không nên. Những gì bạn đã nói có ý nghĩa, tôi sẽ phải đọc lại hướng dẫn với 2.0 lần này. @matt – Alex

61

Các _ được sử dụng để xác định rằng các tham số không được đặt tên

Nếu bạn có nhiều _ nó nói rằng bạn không cần phải đặt tên các tham số trong lời gọi hàm của bạn

func myFunc(name:String, _ age:String){ 
} 

myFunc(“Milo", "I'm a really old wizard") 

Nếu bạn làm không sử dụng dấu gạch dưới bạn sẽ sử dụng

myFunc(“Milo”, age: "I'm a really old wizard") 

_ không cần thiết trong các cuộc gọi chức năng. Nó chỉ được sử dụng để chỉ ra rằng một cái gì đó không có một cái tên.

Liên quan đến cách bạn tham chiếu đến chức năng của mình, Bạn sẽ không phải chuyển bất kỳ tên nào cho lệnh gọi hàm.
Nhưng kể từ khi bạn cũng không định nghĩa một kiểu tham số này dường như với tôi như một ví dụ không hợp lệ (ít nhất không làm việc trong Xcode 7 với nhanh chóng 2.0)

Edit:
Kể từ khi nhanh chóng 3,0

myFunc(name: “Milo”, age: "I'm a really old wizard") 

nên được sử dụng

+0

Tôi mới đến nhanh 2.0. Tôi thấy rằng bạn không sử dụng dấu gạch dưới cho tham số đầu tiên trong cả hai trường hợp. Vì vậy, bạn cũng nên khai báo tên trong các cuộc gọi chức năng như vậy: myFunc (tên: "Milo", tuổi: "Tôi là một thuật sĩ thực sự cũ")? – user234159

10

Khi đề cập đến một hàm, để phân biệt nó là cần thiết để cung cấp tên hàm cùng với tên bên ngoài của bất kỳ tham số nào mà nó mong đợi.

Ví dụ,

func myFunc(myString string: String) { ... }

func myFunc(_ string: String) { ... }

đại diện cho hai chức năng khác nhau, một trong những nơi một nhãn bên ngoài được cung cấp cho các tham số String đầu tiên khi hàm được gọi và nơi không sử dụng nhãn, như sau:

myFunc(myString: "hi")

myFunc("hi")

Vì vậy, để xác định một hàm chúng ta bao gồm các nhãn bên ngoài cho mỗi tham số nơi ':' chỉ ra rằng một tham số là để được cung cấp - ví dụ yourFunc(arg1:arg2:) sẽ lấy 2 đối số.

Khi không có nhãn bên ngoài nào được sử dụng, chúng tôi đặt dấu gạch dưới ('_').

Đối với 2 chức năng đưa ra ở trên, chúng ta sẽ nhận diện chúng bằng cách sử:

myFunc(myString:)myFunc(_:)

Các vấn đề liên quan