2015-04-23 21 views
8

Tôi đã được phát triển ios trong vài tháng và mong muốn thực hiện những điều mới trong mô hình lập trình của mình.Khi nào cần sử dụng đóng cửa nhanh chóng?

Bây giờ tôi đang tìm hiểu các đóng cửa và biết những điều nhỏ về cú pháp của nó, biết rằng nó có thể được sử dụng thay vì ủy nhiệm cho callbacks. Cũng như thực hiện nó trong một số UIViewAnimation và để phân loại.

Nhưng thực sự tôi muốn biết cách sử dụng của nó ngoài việc đó.i.e nơi chúng ta nên sử dụng các bao đóng trong chương trình cơ bản của mình. Giống như chúng tôi sử dụng đại biểu khi chúng tôi muốn gửi thông tin từ trẻ em đến phụ huynh .. Vì vậy, bất kỳ lời giải thích hoặc ví dụ ngắn gọn về thực tế của nó có thể được sử dụng trong ngày của chúng tôi để lập trình nhanh chóng ngày sẽ hữu ích?

bất cứ ai có thể cho tôi biết làm thế nào những đóng thực sự tính toán giá trị

reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 }) 

Trong những ví dụ có tên và đóng cửa như một tham số để một method..but như thế nào điều này thực sự tính toán?

bạn có thể vui lòng giải thích cách thức những tác phẩm này khi đi qua đóng cửa trong mã hoạt hình này:

UIView.animateWithDuration(duration: NSTimeInterval, 
    animations: (() -> Void)?, 
    completion: ((Bool) -> Void)?) 

Tôi thực sự muốn biết về dòng chảy?

Trả lời

15

Hai trường hợp được sử dụng nhiều nhất là các khối hoàn thành và các hàm bậc cao hơn trong Swift.

Khối hoàn thành: ví dụ: khi bạn có tác vụ tốn thời gian, bạn muốn được thông báo khi công việc đó kết thúc. Bạn có thể sử dụng đóng cho rằng, thay vì một đại biểu (hoặc nhiều thứ khác)

func longAction(completion:() ->()) { 
    for index in veryLargeArray { 
     // do something with veryLargeArray, which is extremely time-consuming 
    } 
    completion() // notify the caller that the longAction is finished 
} 

//Or asynch version 
func longAction(completion:() ->()) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

     for elem in veryLargeArray { 
      // do something with veryLargeArray, which is extremely time-consuming 
     } 
     dispatch_async(dispatch_get_main_queue(), { 
      completion() // notify the caller that the longAction is finished 
     }) 
    } 
} 

longAction { print("work done") } 

Trong ví dụ trên, khi bạn có một công việc tốn thời gian, bạn muốn biết khi nào cho vòng lặp kết thúc lặp lại qua rất mảng lớn. Bạn đặt đóng cửa { println("work done") } làm tham số đầu vào cho hàm sẽ được thực hiện sau khi vòng lặp for kết thúc công việc của nó và in "công việc đã hoàn tất". Và những gì đã xảy ra là bạn đã đưa ra một chức năng (đóng) cho longAction và đặt tên nó là completion, và chức năng đó sẽ được thực hiện khi bạn gọi completion trong longAction.

chức năng bậc cao: bạn có thể sử dụng đóng cửa như thông số đầu vào cho các chức năng bậc cao, ví dụ:

let array = [1, 2, 3] 
let smallerThanTwo = array.filter { $0 < 2 } 

Với điều này, bạn có thể lọc ra những con số mà là nhỏ hơn 2.

CẬP NHẬT Về cách sorted (có lẽ) hoạt động:

Vì vậy, ý tưởng là, mà được sắp xếp sẽ đi qua mảng, và so sánh hai phần tử liên tiếp (i, i + 1) với nhau và hoán đổi chúng nếu cần. "Nếu cần" có nghĩa là gì? Bạn đã cung cấp đóng cửa { (s1: String, s2: String) -> Bool in return s1 > s2 }, sẽ trả lại true nếu s1lexiographically lớn hơn s2. Và nếu đóng cửa đó trả về true, thuật toán sorted sẽ hoán đổi hai phần tử đó và đếm số này với hai phần tử tiếp theo (i + 1, i + 2, nếu không kết thúc mảng). Vì vậy, về cơ bản bạn phải cung cấp một đóng cửa cho sorted mà sẽ cho biết "khi" để trao đổi với các yếu tố.

+0

tôi biết một chút về this..can bạn hãy giải thích với một ví dụ về khối hoàn thành? –

+0

@copeME Tôi đã cập nhật câu trả lời của mình bằng một ví dụ. –

+0

@copeME Tôi đã cập nhật câu trả lời của mình bằng cách khám phá cách sắp xếp có thể hoạt động. –

-2

Một đóng cửa là một cái gì đó như:

{ (params) -> returnType in 
    statements 
} 

Dưới đây là một số lý do tại sao để sử dụng nó từ Apple doc

  • Suy luận tham số và giá trị trả về các loại từ ngữ cảnh
  • lợi nhuận Implicit từ đơn biểu đóng cửa
  • tên luận Shorthand
  • Trailing cú pháp đóng cửa
+0

bạn có thể cung cấp cho tôi một ví dụ tốt về cách sử dụng bao đóng như một khối hoàn thành và mô tả cách nó xảy ra ở đó không? –

1
  1. thường đóng cửa không có tên trái ngược với các chức năng khác. Điều đó có nghĩa là chúng có thể được sử dụng trong mọi trường hợp khi bạn muốn chuyển đoạn mã vào một số hàm mà không cần gói mã đó vào phương thức được đặt tên. Phân loại là ví dụ phổ biến nhất.

  2. đóng cửa có thể sử dụng các biến bên ngoài biên giới của mình. Vì vậy, được gọi là "Chụp Values"

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