2014-06-10 17 views
7

Đây có phải là một hàm hoặc một sự đóng không?Swift: định nghĩa và cú pháp của các hàm so với các đóng cửa

let triple: Int -> Int = { 
    (number: Int) in // What is this? 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 
+3

những thứ trước khi 'in' gán các yếu tố đầu vào các chức năng cho các biến đó. Trong trường hợp này, 'số' sẽ được gán cho tham số đầu vào được chuyển đến phần đóng này, đó là' 1'. 'in' là hoàn toàn không liên quan với' inout', mà chỉ định vượt qua tham chiếu – Jack

Trả lời

9

1: Đó là đóng.

Ví dụ:

func aFunction() ->() { 
    // do something 
} 

let aClosure:() ->() = { 
    // do something 
} 

Chức năng thực sự là một trường hợp đặc biệt của việc đóng cửa. Bạn có thể viết một đóng cửa mà không có tên bằng mã xung quanh có dấu ngoặc ôm ({}). Sử dụng trong để tách các đối số và loại trả về khỏi nội dung.

Trích: Apple Inc. "Ngôn ngữ lập trình Swift". IBooks. https://itun.es/us/jEUH0.l

2: "trong" chỉ là ký hiệu được chọn để thể hiện nơi kết thúc đối số/kiểu trả về và phần thân của quá trình đóng bắt đầu. Nó không có gì để làm với inout.

+2

Tại sao tôi sử dụng chức năng và không sử dụng đóng cửa hoặc ngược lại điều này? sự khác biệt thực sự là gì? –

5

Đó là ràng buộc việc đóng cửa cho hằng số triple nếu được thực hiện trong phạm vi toàn cầu tương tự như khai báo nó như một hàm (xem chú thích của Eric bên dưới để biết sự khác biệt). Dòng (number: Int) in khai báo các tham số đầu vào cho việc đóng.

Trong trường hợp này loại có thể được bỏ qua mặc dù kể từ khi nó có thể được suy ra từ các loại đóng cửa, và vì nó chỉ có một tuyên bố nó có thể được viết dưới dạng một biểu thức đóng cửa với lợi nhuận tiềm ẩn như:

let triple: Int -> Int = { number in 
    3 * number 
} 

// or as a function 
func triple(number: Int) -> Int { 
    return 3 * number 
} 

// Or as the very short 
let triple: Int -> Int = { 3 * $0 } 

Bạn có thể đọc thêm về nó trong chương tài liệu chính thức về đóng cửa.

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

+3

Việc ràng buộc việc đóng một biến là tương tự, nhưng ** không ** giống như khai báo nó như một hàm. Ba ví dụ về sự khác biệt quan trọng bao gồm quá tải, giá trị tham số mặc định và generics, không có sự ràng buộc nào có thể hỗ trợ. –

+0

Đó là sự thật, tôi đã cập nhật câu trả lời với một con trỏ đến nhận xét này. – hallski

4

Swift đóng cửa được định nghĩa như sau:

{ (parameters) -> return type in 
    statements 
} 

Như vậy, mẫu mã của bạn được coi là một đóng theo định nghĩa. Tuy nhiên, tôi sẽ viết lại nó như sau bằng cách di chuyển kiểu trả về trong dấu ngoặc nhọn:

let triple = { 
    (number: Int) -> Int in 
    let result = 3 * number 
    number 
    return result 
} 

triple(1) 

Các thông số và kiểu trả về bắt đầu sau cú đúp xoăn mở và kết thúc trước khi vào từ khóa và cơ thể của việc đóng cửa bắt đầu sau khi trong từ khóa và kết thúc tại dấu ngoặc nhọn đóng. Tiếp theo, tôi sẽ khuyên bạn nên tải về và đọc iBook từ iTunes có thể tìm thấy tại vị trí sau:

https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

3

Một cách dễ dàng để phân biệt giữa chức năng và đóng cửa là,

Chức năng toàn cầu: Có một tên. Không nắm bắt bất kỳ giá trị nào.

Chức năng lồng nhau: Có tên. Capture các giá trị từ hàm kèm theo.

Đóng cửa: Không có tên như hàm. Chụp các giá trị từ các khối liền kề.

3

Một chức năng là một đóng cửa có một cái tên. Việc đóng cửa bạn đã cung cấp, có một tên và do đó là cả một chức năng và một đóng cửa.

Từ trang web của nhà phát triển của Apple:

chức năng toàn cầu và lồng nhau, như đã giới thiệu ở Chức năng, thực sự trường hợp đặc biệt của việc đóng cửa. Đóng cửa có một trong ba hình thức:

Chức năng toàn cầu là các bao đóng có tên và không nắm bắt bất kỳ giá trị nào. Hàm lồng nhau là các bao đóng có tên và có thể nắm bắt các giá trị từ hàm kèm theo của chúng. biểu thức đóng cửa là vô danh đóng cửa viết bằng một cú pháp nhẹ có thể chụp các giá trị từ ngữ cảnh xung quanh họ.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

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