2015-01-13 15 views
8

Tôi đang cố gắng tìm hiểu về nhanh chóng và đóng cửa. Tôi bị kẹt trong ví dụ này.Không hiểu ví dụ đóng cửa trong Swift

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

(số: Int) -> Int là gì? Nó là một chức năng? Nó được định nghĩa ở đâu? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

Từ khóa "trong" làm gì? Các tài liệu nói để sử dụng "để tách các đối số và trả về kiểu từ cơ thể". Tôi không chắc tôi hiểu điều này. Tại sao không phải là "trong" được sử dụng để tách "let result = 3 * number" từ "return result".

+2

Đây cũng là phần giới thiệu tốt về các đóng cửa trong Swift: http: //letvargo.mooo.com/a-beginners-guide-to-closures-in-swift/) –

Trả lời

28

Một đóng cửa chỉ là một chức năng với các thông số di chuyển bên trong dấu ngoặc, với từ khóa in để tách các tham số khỏi thân hàm. Hai ví dụ sau đây xác định các chức năng tương đương:

func myFunc(number: Int) -> Int { 
    let result = 3 * number 
    return result 
} 

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

Bạn thực sự có thể gọi cho họ cả về chính xác theo cùng một cách:

let x = myFunc(2)  // x == 6 
let y = myClosure(2) // y == 6 

Thông báo như thế nào ví dụ thứ hai là chính xác giống như là người đầu tiên, duy nhất trong ví dụ đầu tiên, các tham số (number: Int) -> Int nằm ngoài các dấu ngoặc và trong ví dụ thứ hai các tham số nằm trong dấu ngoặc vuông, theo sau là từ khóa in.

map hoạt động bằng cách lấy một mảng (numbers, trong ví dụ của bạn) và tạo một mảng mới là kết quả của việc áp dụng hàm đóng cho mỗi phần tử trong numbers. Vì vậy, nếu numbers[1, 2, 3], ví dụ ở trên sẽ bắt đầu bằng 1. Nó sẽ áp dụng các chức năng đóng cửa mà sẽ sản xuất một 3 (cuz tất cả nó là nhân các yếu tố từ mảng đầu tiên của 3). Nó làm điều đó cho mỗi phần tử trong numbers, cho đến khi nó tạo ra một mảng mới, [3, 6, 9].

Nếu bạn muốn, bạn có thể gọi map sử dụng tên của một trong hai chức năng ở trên hoặc đóng cửa ở trên hoặc bằng cách viết rõ ràng bên trong map. Tất cả các ví dụ dưới đây là hoàn toàn tương đương:

let numbers = [1, 2, 3] 

// Example 1 
let times3 = numbers.map(myFunc)  // times3 == [3, 6, 9] 

// Example 2 
let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9] 

// Example 3 
let xThree = numbers.map({ (number: Int) -> Int in 
    let result = 3 * number 
    return result      // xThree == [3, 6, 9] 
}) 

Lưu ý rằng Ví dụ 3 là giống như ví dụ 2, chỉ trong Ví dụ 3 đóng cửa được nêu ra một cách rõ ràng bên trong map, trong khi trong Ví dụ 2 đóng cửa đã được chỉ định đến một hằng số được gọi là myClosure và hằng số được cung cấp cho map.

Hy vọng điều này sẽ giúp - việc đóng cửa vui nhộn nhưng gây nhầm lẫn.

+0

tôi cũng bị kẹt với bao đóng, nhưng câu trả lời của bạn giúp tôi hiểu. Cảm ơn bạn. –

+0

Xin cảm ơn Roman, điều này chắc chắn đã giúp bạn. Bây giờ nó rất rõ ràng với tôi. Lời giải thích của Apple hơi quá dốc để có được lần thử đầu tiên. –

+0

Cảm ơn bạn rất nhiều! Nó thực sự giúp tôi hiểu cách đoạn mã này hoạt động như thế nào. –

1

Chức năng bạn đang gọi điện thoại có một kết thúc như tham số của nó:

numbers.map({...}) 

Việc đóng cửa cung cấp cho các chức năng dự kiến ​​sẽ nhận một tham số khi nó được thực hiện bởi các chức năng bạn gọi. Thông số này được xác định trong việc đóng cửa của bạn:

(number: Int) -> Int in 

Bây giờ bạn có thể sử dụng tham số trong nội dung của việc đóng cửa

let result = 3 * number 
    return result 
0

Đóng cửa là các khối chức năng độc lập có thể được chuyển và sử dụng trong mã của bạn.

Cú pháp:

{(parameterName: ParameterType) -> returnType in 
    //Statements 
} 

thực Kịch bản: Khi người dùng muốn áp dụng bộ lọc và muốn chọn các giá trị đó là hơn 300 (trong trường hợp này), chúng tôi có thể sử dụng đóng cửa để đạt được điều này.

var elements: [Int] = [Int]() //Declaring Empty array 
elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133] 

var filteredElements = elements.map({(num: Int) -> Int? in 
    return num > 300 ? num : nil 
}) 

output: 
[Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil] 

Từ Dưới đây mã bạn có thể rõ ràng nhìn thấy chúng tôi đang đi qua đóng cửa để elements.map) chức năng (.

Đóng cửa:

{(num: Int) -> Int? in 
     return num > 300 ? num : nil 
    } 

(num:Int) là tham số. Int? là chúng ta sẽ trả về kiểu Integer tùy chọn.

Sau in chúng tôi có thể viết logic của bạn.

Bạn có thể đọc thêm về đóng cửa here.

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