Có một vài sắc thái cho các trường hợp sử dụng khác nhau, nhưng nói chung, dấu gạch dưới có nghĩa là "bỏ qua điều này".
Khi khai báo một hàm mới, dấu gạch dưới nói với Swift rằng tham số sẽ không có nhãn khi được gọi - đó là trường hợp bạn đang thấy. Một khai báo hàm đầy đủ hơn trông như thế này:
func myFunc(label name: Int) // call it like myFunc(label: 3)
"nhãn" là nhãn đối số và phải có mặt khi bạn gọi hàm. (Và kể từ Swift 3, các nhãn được yêu cầu cho tất cả các đối số theo mặc định.) "Name" là tên biến cho đối số mà bạn sử dụng bên trong hàm. Một hình thức ngắn hơn trông như thế này:
func myFunc(name: Int) // call it like myFunc(name: 3)
Đây là lối tắt cho phép bạn sử dụng cùng một từ cho cả nhãn đối số bên ngoài và tên tham số bên trong. Nó tương đương với func myFunc(name name: Int)
.
Nếu bạn muốn chức năng của mình có thể gọi được mà không có nhãn tham số, bạn sử dụng dấu gạch dưới _
để làm cho nhãn không có gì / bị bỏ qua. (Trong trường hợp đó, bạn phải cung cấp một tên nội bộ nếu bạn muốn có thể sử dụng tham số.)
func myFunc(_ name: Int) // call it like myFunc(3)
Trong câu lệnh gán, dấu gạch dưới có nghĩa là "không gán cho bất cứ thứ gì". Bạn có thể sử dụng điều này nếu bạn muốn gọi một hàm trả về kết quả nhưng không quan tâm đến giá trị được trả về.
_ = someFunction()
Hoặc, như trong bài viết bạn liên kết đến, để bỏ qua một yếu tố của bộ dữ liệu được trả về:
let (x, _) = someFunctionThatReturnsXandY()
Khi bạn viết một bao đóng thực hiện một số loại hàm được xác định, bạn có thể sử dụng dấu gạch dưới để bỏ qua các tham số nhất định.
PHPhotoLibrary.performChanges( { /* some changes */ },
completionHandler: { success, _ in // don't care about error
if success { print("yay") }
})
Tương tự, khi khai báo một hàm thông qua một giao thức hoặc ghi đè một phương thức siêu lớp, bạn có thể sử dụng _
cho các tên tham số để bỏ qua các tham số. Vì giao thức / siêu lớp cũng có thể xác định rằng tham số không có nhãn, thậm chí bạn có thể kết thúc bằng hai dấu gạch dưới liên tiếp.
class MyView: NSView {
override func mouseDown(with _: NSEvent) {
// don't care about event, do same thing for every mouse down
}
override func draw(_ _: NSRect) {
// don't care about dirty rect, always redraw the whole view
}
}
Một số liên quan đến hai kiểu cuối cùng: khi sử dụng cấu trúc điều khiển luồng liên kết một biến / hằng cục bộ, bạn có thể sử dụng _
để bỏ qua nó. Ví dụ: nếu bạn muốn lặp lại một chuỗi mà không cần truy cập vào các thành viên của nó:
for _ in 1...20 { // or 0..<20
// do something 20 times
}
Nếu bạn ràng buộc các trường hợp tuple trong câu lệnh chuyển đổi, dấu gạch dưới có thể hoạt động như một ký tự đại diện, như trong ví dụ này (rút ngắn từ một trong Ngôn ngữ lập trình Swift ):
switch somePoint { // somePoint is an (Int, Int) tuple
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, \(somePoint.1)) is on the y-axis")
default:
print("(\(somePoint.0), \(somePoint.1)) isn't on an axis")
}
Một điều cuối cùng đó là không hoàn toàn liên quan, nhưng mà tôi sẽ bao gồm từ (như đã nêu bởi comments) có vẻ như để lãnh đạo nhân dân ở đây: Một dấu gạch dưới trong một định - ví dụ như var _foo
, func do_the_thing()
, struct Stuff_
- phương tiện không có gì đặc biệt để Swift, nhưng có một vài công dụng trong số các lập trình viên.
Dấu gạch dưới trong tên là một lựa chọn kiểu, nhưng không được ưa thích trong cộng đồng Swift, vốn có những quy ước mạnh mẽ về việc sử dụng UpperCamelCase cho các loại và lowCamelCase cho tất cả các biểu tượng khác.
Tiền tố hoặc thêm một tên biểu tượng với dấu gạch dưới là một quy ước kiểu, trong lịch sử được sử dụng để phân biệt các biểu tượng chỉ sử dụng riêng / nội bộ với API xuất khẩu. Tuy nhiên, Swift có các sửa đổi truy cập cho điều đó, vì vậy quy ước này thường được xem là không thành ngữ trong Swift.
Một vài biểu tượng có tiền tố gạch dưới kép ( func __foo()
) ẩn sâu trong các SDK của Apple: Đây là các biểu tượng (Obj) C được nhập vào Swift bằng NS_REFINED_FOR_SWIFT
thuộc tính. Apple sử dụng điều đó khi họ muốn tạo một phiên bản "Obifty" hơn của API (Obj) C - ví dụ, để biến một phương thức bất khả tri thành một phương thức chung . Họ cần sử dụng API đã nhập để làm cho phiên bản Swift tinh chỉnh hoạt động, vì vậy họ sử dụng __
để giữ nó có sẵn trong khi ẩn nó khỏi hầu hết các công cụ và tài liệu.