Swift - Đóng cửa

Closures trong Swift 4 tương tự như các hàm khép kín được tổ chức thành các khối và được gọi ở bất kỳ đâu như ngôn ngữ C và Objective C. Các hằng số và tham chiếu biến được định nghĩa bên trong các hàm được ghi lại và lưu trữ trong các bao đóng. Các hàm được coi là trường hợp đóng đặc biệt và nó có ba dạng sau:

Chức năng toàn cầu Các hàm lồng nhau Biểu thức đóng cửa
Có một cái tên. Không nắm bắt bất kỳ giá trị nào Có một cái tên. Nắm bắt các giá trị từ chức năng bao quanh Các khu vực đóng cửa không đặt tên nắm bắt các giá trị từ các khối liền kề

Các biểu thức đóng trong ngôn ngữ Swift 4 tuân theo các kiểu cú pháp sắc nét, tối ưu hóa và gọn nhẹ bao gồm.

  • Suy ra các kiểu tham số và giá trị trả về từ ngữ cảnh.
  • Trả về ngầm định từ các đóng biểu thức đơn.
  • Tên đối số viết tắt và
  • Cú pháp đóng theo dõi

Cú pháp

Sau đây là một cú pháp chung để định nghĩa bao đóng chấp nhận các tham số và trả về một kiểu dữ liệu:

{
   (parameters) −> return type in
   statements
}

Sau đây là một ví dụ đơn giản -

let studname = { print("Welcome to Swift Closures") }
studname()

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

Welcome to Swift Closures

Đóng sau chấp nhận hai tham số và trả về giá trị Bool:

{     
   (Int, Int) −> Bool in
   Statement1
   Statement 2
   ---
   Statement n
}

Sau đây là một ví dụ đơn giản -

let divide = {
   (val1: Int, val2: Int) -> Int in 
   return val1 / val2 
}

let result = divide(200, 20)
print (result)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

10

Biểu thức trong Closures

Các hàm lồng nhau cung cấp một cách thuận tiện để đặt tên và xác định các khối mã. Thay vì đại diện cho toàn bộ khai báo hàm và cấu trúc tên được sử dụng để biểu thị các hàm ngắn hơn. Việc biểu diễn hàm trong một câu lệnh ngắn gọn rõ ràng với cú pháp tập trung được thực hiện thông qua các biểu thức đóng.

Chương trình thứ tự tăng dần

Việc sắp xếp một chuỗi được thực hiện nhờ chức năng dành riêng cho khóa Swift 4s "sắp xếp" đã có sẵn trong thư viện chuẩn. Hàm sẽ sắp xếp các chuỗi đã cho theo thứ tự tăng dần và trả về các phần tử trong một mảng mới có cùng kích thước và kiểu dữ liệu được đề cập trong mảng cũ. Mảng cũ vẫn giữ nguyên.

Hai đối số được biểu diễn bên trong hàm đã sắp xếp -

  • Giá trị của kiểu đã biết được biểu diễn dưới dạng mảng.

  • Nội dung mảng (Int, Int) và trả về giá trị Boolean (Bool) nếu mảng được sắp xếp đúng, nó sẽ trả về giá trị true nếu không sẽ trả về false.

Một hàm thông thường với chuỗi đầu vào được viết và chuyển đến hàm đã sắp xếp để các chuỗi được sắp xếp thành mảng mới được hiển thị bên dưới:

func ascend(s1: String, s2: String) -> Bool {
   return s1 > s2
}

let stringcmp = ascend(s1: "Swift 4", s2: "great")
print (stringcmp)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

true

Mảng ban đầu được sắp xếp cho icecream được cho là "Swift 4" và "great". Hàm sắp xếp mảng được khai báo là kiểu dữ liệu chuỗi và kiểu trả về của nó được đề cập là Boolean. Cả hai chuỗi đều được so sánh và sắp xếp theo thứ tự tăng dần và được lưu trữ trong một mảng mới. Nếu việc sắp xếp được thực hiện thành công, hàm sẽ trả về một giá trị true, nếu không nó sẽ trả về giá trị false.

Cú pháp biểu thức đóng sử dụng -

  • tham số không đổi,
  • tham số biến và
  • tham số inout.

Biểu thức đóng không hỗ trợ các giá trị mặc định. Các tham số Variadic và Tuples cũng có thể được sử dụng làm kiểu tham số và kiểu trả về.

let sum = {
   (no1: Int, no2: Int) -> Int in 
   return no1 + no2 
}

let digits = sum(10, 20)
print(digits)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

30

Các tham số và khai báo kiểu trả về được đề cập trong câu lệnh hàm cũng có thể được biểu diễn bằng hàm biểu thức đóng nội tuyến với từ khóa 'in'. Sau khi khai báo các loại tham số và trả về, từ khóa 'in' được sử dụng để biểu thị rằng phần thân của bao đóng.

Trả về một biểu thức tiềm ẩn

Ở đây, kiểu hàm của đối số thứ hai của hàm được sắp xếp làm rõ ràng rằng giá trị Bool phải được trả về bằng cách đóng. Vì phần thân của bao đóng chứa một biểu thức duy nhất (s1> s2) trả về giá trị Bool, nên không có sự mơ hồ và từ khóa trả về có thể bị bỏ qua.

Để trả về một câu lệnh Biểu thức đơn trong biểu thức đóng, từ khóa 'return' bị bỏ qua trong phần khai báo của nó.

var count:[Int] = [5, 10, -6, 75, 20]
let descending = count.sorted(by: { n1, n2 in n1 > n2 })
let ascending = count.sorted(by: { n1, n2 in n1 < n2 })

print(descending)
print(ascending)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

[75, 20, 10, 5, -6]
[-6, 5, 10, 20, 75]

Bản thân câu lệnh xác định rõ ràng rằng khi chuỗi1 lớn hơn chuỗi 2 trả về true, ngược lại là false do đó câu lệnh trả về bị bỏ qua ở đây.

Loại đóng cửa đã biết

Xét phép cộng hai số. Chúng ta biết rằng việc bổ sung sẽ trả về kiểu dữ liệu số nguyên. Do đó, các kiểu đóng cửa đã biết được khai báo là:

let sub = {
   (no1: Int, no2: Int) -> Int in 
   return no1 - no2 
}

let digits = sub(10, 20)
print(digits)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

-10

Khai báo tên đối số viết tắt là Closures

Swift 4 tự động cung cấp tên đối số viết tắt cho các bao đóng nội tuyến, có thể được sử dụng để tham chiếu đến giá trị của các đối số của bao đóng bằng các tên $ 0, $ 1, $ 2, v.v.

var shorthand: (String, String) -> String
shorthand = { $1 }
print(shorthand("100", "200"))

Ở đây, $ 0 và $ 1 tham chiếu đến các đối số Chuỗi đầu tiên và thứ hai của bao đóng.

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

200

Swift 4 tạo điều kiện cho người dùng biểu diễn các bao đóng Nội tuyến dưới dạng tên đối số viết tắt bằng cách biểu diễn $ 0, $ 1, $ 2 --- $ n.

Danh sách đối số đóng bị bỏ qua trong phần định nghĩa khi chúng ta biểu diễn tên đối số viết tắt bên trong biểu thức đóng. Dựa trên kiểu hàm, tên đối số viết tắt sẽ được dẫn xuất. Vì đối số viết tắt được xác định trong nội dung biểu thức nên từ khóa 'in' bị bỏ qua.

Đóng cửa như các chức năng của nhà điều hành

Swift 4 cung cấp một cách dễ dàng để truy cập các thành viên bằng cách chỉ cung cấp các hàm toán tử dưới dạng các bao đóng. Trong các ví dụ trước, từ khóa 'Bool' được sử dụng để trả về 'true' khi các chuỗi bằng nhau, nếu không nó trả về 'false'.

Biểu thức thậm chí còn đơn giản hơn bởi hàm toán tử trong bao đóng là:

let numb = [98, -20, -30, 42, 18, 35]
var sortedNumbers = numb.sorted ({
   (left: Int, right: Int) -> Bool in
   return left < right
})

let asc = numb.sorted(<)
print(asc)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

[-30, -20, 18, 35, 42, 98]

Đóng dưới dạng rơ moóc

Việc chuyển đối số cuối cùng của hàm tới một biểu thức đóng được khai báo với sự trợ giúp của 'Trailing Closures'. Nó được viết bên ngoài hàm () với {}. Việc sử dụng nó là cần thiết khi không thể viết hàm nội tuyến trên một dòng.

reversed = sorted(names) { $0 > $1}

trong đó {$ 0> $ 1} được biểu thị dưới dạng các dấu đóng cuối được khai báo bên ngoài (tên).

import Foundation
var letters = ["North", "East", "West", "South"]

let twoletters = letters.map({ 
   (state: String) -> String in
   return state.substringToIndex(advance(state.startIndex, 2)).uppercaseString
})

let stletters = letters.map() { 
   $0.substringToIndex(advance($0.startIndex, 2)).uppercaseString 
}
print(stletters)

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

[NO, EA, WE, SO]

Nắm bắt giá trị và loại tham chiếu

Trong Swift 4, việc nắm bắt các giá trị hằng và biến được thực hiện với sự trợ giúp của các bao đóng. Nó tiếp tục tham chiếu và sửa đổi các giá trị cho các hằng số và biến đó bên trong phần thân đóng mặc dù các biến đó không còn tồn tại.

Việc nắm bắt các giá trị hằng số và biến được thực hiện bằng cách sử dụng hàm lồng nhau bằng cách viết hàm với trong phần thân của hàm khác.

Một hàm lồng nhau nắm bắt -

  • Đối số hàm ngoài.
  • Chụp các hằng số và biến được xác định trong hàm Outer.

Trong Swift 4, khi một hằng hoặc một biến được khai báo bên trong một hàm, thì tham chiếu đến các biến đó cũng được tự động tạo ra bằng cách đóng. Nó cũng cung cấp cơ sở để tham chiếu nhiều hơn hai biến dưới dạng bao đóng tương tự như sau:

let decrem = calcDecrement(forDecrement: 18)
decrem()

Đây oneDecrement và các biến Decrement đều sẽ trỏ cùng một khối bộ nhớ làm tham chiếu đóng.

func calcDecrement(forDecrement total: Int) -> () -> Int {
   var overallDecrement = 100
   func decrementer() -> Int {
      overallDecrement -= total
      print(overallDecrement)
      return overallDecrement
   }
   return decrementer
}

let decrem = calcDecrement(forDecrement: 18)
decrem()
decrem()
decrem()

Khi chúng tôi chạy chương trình trên bằng sân chơi, chúng tôi nhận được kết quả sau:

82
64
46

Khi mỗi lần hàm bên ngoài calcDecrement được gọi, nó sẽ gọi hàm decmenter () và giảm giá trị đi 18 và trả về kết quả với sự trợ giúp của hàm bên ngoài calcDecrement. Ở đây calcDecrement hoạt động như một sự đóng lại.

Mặc dù theo mặc định, hàm decmenter () không có bất kỳ đối số nào đóng tham chiếu đến các biến 'totalDecrement' và 'total' bằng cách nắm bắt các giá trị hiện có của nó. Bản sao của các giá trị cho các biến đã chỉ định được lưu trữ bằng hàm giảm dần () mới. Swift 4 xử lý các chức năng quản lý bộ nhớ bằng cách cấp phát và giải quyết các không gian bộ nhớ khi các biến không được sử dụng.