Có khá nhiều ở đây, vì vậy chúng tôi sẽ phá vỡ nó xuống một mảnh tại một thời điểm:
func fetchOrders(_ completionHandler: (_ orders: [Order]) -> Void)
- Đây là một chức năng gọi là
fetchOrders
.
- Nó có một tham số (
completionHandler
) và không trả về gì cả.
- Đầu tiên
_
cho biết không có "tên bên ngoài" của tham số đầu tiên. Tức là, bạn không phải gắn nhãn nó (trên thực tế, bạn không thể). (Vì những lý do không thực sự quan trọng ở đây, tôi tin rằng tác giả đã phạm sai lầm khi sử dụng _
ở đó và tôi sẽ không làm điều đó.)
completionHandler
là "tên nội bộ", thông số được gọi bên trong chức năng.
- Loại
completionHandler
là (_ orders: [Order]) -> Void
. Chúng ta sẽ phá vỡ nó ngay bây giờ.
- Giá trị này là đóng cửa phải mất
[Order]
(mảng Order
) và trả lại Void
. Về cơ bản, điều này có nghĩa là "trả về không có gì" nhưng theo nghĩa đen nghĩa là nó trả về bộ trống rỗng ()
.
- Cú pháp
_ orders:
thực tế là nhận xét. Về nguyên tắc, _
là tên bên ngoài (nhưng đó là tên ngoài hợp pháp duy nhất để đóng) và orders
là tên nội bộ, nhưng trên thực tế, các thông số đóng không có tên theo bất kỳ cách nào có ý nghĩa, vì vậy đây hoàn toàn là thông tin.
- Tôi tin rằng đây là việc sử dụng kém hệ thống nhận xét tham số đóng.Vì
orders
cho chúng tôi biết không có gì hơn [Order]
, tôi đã bỏ qua nó và tạo loại chỉ ([Order]) -> Void
.
Bây giờ chúng ta sẽ chuyển sang dòng tiếp theo:
ordersStore.fetchOrders { (orders:() throws -> [Order]) -> Void in
- này gọi phương thức
fetchOrders
trên ordersStore
. Chúng ta có thể nói từ mã này rằng fetchOrders
có tham số đóng. Điều này được gọi là cú pháp "trailing closure" trong Swift, và là lý do tại sao tôi sẽ không sử dụng _
cho việc đóng của chúng ta. Với cú pháp đóng dấu, tên bên ngoài của tham số là không cần thiết.
- Tác giả đã cung cấp thông tin loại ở đây có thể không cần thiết, nhưng chúng tôi vẫn có thể khám phá thông tin đó. Điều này có thể có thể đã được viết như chỉ
{ orders in
, nhưng sau đó người đọc có thể sẽ ngạc nhiên bởi mã hơi bất thường này.
- Chúng tôi đã được thông qua một đóng cửa được gọi là
orders
không mất gì và trả lại [Order]
hoặc ném lỗi. Về cơ bản đây là một cách để nói rằng fetchOrders
có thể thất bại.
- Tác giả đang làm việc xung quanh một sự lúng túng trong hệ thống
throws
của Swift, không có cách tự nhiên để thể hiện một hành động không đồng bộ có thể không thành công. Đây là một cách để sửa chữa nó; bạn vượt qua một chức năng ném (tức là có thể thất bại). Tôi không ủng hộ cách tiếp cận này, tôi ủng hộ việc sử dụng Result
enum cho trường hợp này vì tôi nghĩ rằng nó cân tốt hơn và tránh các tác dụng phụ không mong muốn, nhưng đó là điểm đáng tranh cãi (và cộng đồng Swift đã không thực sự quyết định cách xử lý vấn đề này vấn đề thường gặp).
này tất cả đưa chúng ta đến:
do {
let orders = try orders()
completionHandler(orders)
} catch {
completionHandler([])
}
- Đây là nơi đóng
orders
được đánh giá. (Điều này rất quan trọng, nếu orders
có các tác dụng phụ, đây là khi chúng xảy ra, có thể nằm trên một hàng đợi khác so với dự định. Đó là một lý do tôi không ưa thích mẫu này.) Nếu việc đóng thành công, chúng tôi trả về kết quả của nó , nếu không, chúng tôi trả lại []
trong số catch
bên dưới.
- Trong đặc biệt trường hợp này, cách tiếp cận
throws
là hơi ngớ ngẩn, bởi vì nó âm thầm dẹp vào []
mà không cần nhắn tin đăng nhập. Nếu chúng tôi không quan tâm đến lỗi, thì sự cố sẽ chỉ cần trả lại []
để bắt đầu và không bị nhầm lẫn với throws
. Nhưng có thể những người gọi khác kiểm tra lỗi.
- Trong cả hai trường hợp, chúng tôi gọi kết thúc là
completionHandler
, kết nối lại với người gọi ban đầu của chúng tôi.
/catch block làm này có thể đã được đơn giản hơn bằng văn bản như:
let completedOrders = try? orders() ?? []
completionHandler(completedOrders)
Điều này làm cho nó rõ ràng rằng chúng ta đang bỏ qua lỗi bằng cách chuyển nó thành một tùy chọn, và tránh việc lặp lại code của cuộc gọi đến completionHandler
.
(Tôi chỉ cần thêm thêm let
ràng buộc để làm cho đoạn code một chút dễ dàng hơn để đọc;. Nó không cần thiết)
Nguồn
2016-10-05 13:26:34
Reading chương "Chức năng" trong cuốn sách Swift tham khảo có thể hữu ích ... –