2016-09-21 57 views
5

Tôi đang chuyển đổi mã sang Swift bằng Xcode 8, nhưng trình biên dịch cảnh báo thêm @escape vào một số hàm lồng nhau đã được tạo trong Swift 2.3, với cú pháp đóng. Tôi đã tìm thấy một số từ khóa khác cũng @noescape@autoclosure, nhưng tôi có một số câu hỏi về vấn đề này:Sự khác biệt giữa @noescape, @escaping và @autoclosure là gì?

  1. cần chức năng của từ khóa này là gì?
  2. Tác động của việc viết @escaping là gì?
  3. Bạn có cần viết không?
  4. Có phải @autoclosure hoạt động giống như @escape?
  5. Khi nào nên sử dụng từ khóa nào và tại sao?

Đây là tài liệu Swift-evolution nhưng không nhận được nhiều từ tài liệu đó.

+0

Tôi vừa nhận thấy rằng bạn đã gắn thẻ câu hỏi Swift 3. Không có '@ noescape' hoặc' @ escape' trong Swift 3. – Sulthan

Trả lời

9

Sự khác biệt quan trọng nhất là giữa @escaping@noescaping (không có từ khóa nào trong Swift 3!). Khi đóng cửa được đánh dấu là @noescape, bạn có thể chắc chắn rằng việc đóng sẽ không được giữ lại theo phương pháp (ví dụ để thực hiện cuộc gọi không đồng bộ), do đó bạn không phải lo lắng về chu kỳ sở hữu (có một số lợi ích nhỏ khác).

@escaping đóng cửa có thể được lưu hoặc gọi đôi khi trong tương lai do đó bạn phải chắc chắn xử lý quyền sở hữu (ví dụ: [weak self]) một cách chính xác.

Đối với @autoclosure xem How to use Swift @autoclosure. Trong ngắn hạn, nó cho phép bạn bỏ qua niềng răng xung quanh việc đóng cửa trong một số tình huống.

Giá trị mặc định (khi không được chỉ định) là @noescaping trong Swift 3 (xem rationale). Họ từ khóa không thực sự tồn tại nữa. Chỉ có @escaping.

+1

Câu trả lời hay, sẽ tốt hơn nếu bạn thêm ví dụ mã, vì vậy người khác sẽ có ý tưởng tốt hơn cho cả ba từ khóa. Cảm ơn – technerd

3

@escape có nghĩa là chức năng của bạn có thể được gọi sau khi phương thức kết thúc. @noescape có nghĩa là việc đóng cửa của bạn sẽ được gọi trước khi kết thúc chức năng được chuyển đến. @autoclosure có nghĩa là bạn có thể bỏ qua việc viết dấu ngoặc đóng, nhưng nó sẽ tự động trở thành @noescape. @autoclosure tạo tự động đóng xung quanh biểu thức. Vì vậy, khi người gọi viết một biểu thức như 2> 1, nó sẽ tự động được bao bọc thành một đóng cửa để trở thành {2> 1} trước khi nó được truyền cho một số chức năng.

2 - Dễ dàng hơn cho trình biên dịch để thực hiện tối ưu hóa.

3 - beter để viết, để cung cấp cho trình biên dịch (hoặc ai đó sử dụng chức năng của bạn) thông tin như thế nào nó cư xử với đóng cửa của bạn

4 - không

5 - mô tả trên đỉnh của câu trả lời

+0

giải thích tuyệt vời –

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