2015-06-22 21 views
12

Tôi cố gắng sử dụng mô hình xử lý lỗi trong Swift2.Tương đương với điều gì cuối cùng trong Swift

do { 
    try NSFileManager.defaultManager().removeItemAtPath("path") 
} catch { 
    // ... 
} finally { 
    // compiler error. 
} 

Nhưng có vẻ như là không có finally từ khóa ra there.How tôi có thể đạt được try-catch-finally pattern trong Swift.Any giúp đỡ được chào đón.

+0

nó ** trì hoãn ** - một trong những điều quan trọng nhất trong tất cả Swift – Fattie

Trả lời

15

Nếu bạn đang suy nghĩ về SWIFT Xử lý lỗi 2.0 là điều tương tự như ngoại lệ bạn là sai lầm.
Đây không phải là ngoại lệ, đây là lỗi phù hợp với giao thức được gọi là ErrorType.
Mục đích của khối là chặn lỗi được ném bởi hàm hoặc phương thức ném.
Về cơ bản không có finally, những gì bạn có thể làm là gói mã của bạn trong khối defer, điều này được đảm bảo sẽ được thực thi và kết thúc phạm vi.
Dưới đây là một mẫu từ SWIFT 2 programming guide

func processFile(filename: String) throws { 
    if exists(filename) { 
     let file = open(filename) 
     defer { 
      close(file) 
     } 
     while let line = try file.readline() { 
      /* Work with the file. */ 
     } 
     // close(file) is called here, at the end of the scope. 
    } 
} 

Bạn sử dụng một tuyên bố hoãn đến thực hiện một tập hợp các báo cáo ngay trước thực thi mã rời khỏi khối hiện tại của mã. Điều này cho phép bạn thực hiện bất kỳ hoạt động dọn dẹp cần thiết nào cần thực hiện bất kể xảy ra lỗi hay không. Ví dụ bao gồm đóng bất kỳ mô tả tệp mở nào và giải phóng mọi bộ nhớ được phân bổ theo cách thủ công.

2

Những gì bạn đang tìm kiếm được gọi là defer. Nó định nghĩa một khối mã không được thực hiện cho đến khi thực hiện chỉ là sắp rời khỏi phạm vi hiện tại, nhưng nó luôn được thực thi.

func processFile(filename: String) throws { 
    if exists(filename) { 
     let file = open(filename) 
     defer { 
      close(file) 
     } 
     while let line = try file.readline() { 
      /* Work with the file. */ 
     } 
     // close(file) is called here, at the end of the scope. 
    } 
} 

Để biết thêm chi tiết về defer hãy xem Apple Swift documentation, especially section "Specifying Clean-up Actions".

1

Swift 2 giới thiệu mất riêng của mình về yêu cầu này bằng cách sử dụng từ khóa defer

defer { 
    print("Do clean up here") 
} 

finally = defer trong Swift 2.

Điều cho defer từ khóa

+0

"cuối cùng = trì hoãn" - Không chính xác. Trong một thử/bắt/cuối cùng trong các ngôn ngữ như C# hoặc Java, khối cuối cùng sẽ được thực hiện bất kể có ngoại lệ hay không. Hành vi này cung cấp lợi ích của việc có thể đặt mã trong một khối cuối cùng sẽ được thực hiện không có vấn đề gì. Trong nhanh chóng, trì hoãn chỉ thực thi sau phạm vi hiện tại, và một khối catch sẽ nằm trong một phạm vi khác. Vì vậy, nó không hoàn toàn giống như "cuối cùng". – dcp

6

Hoãn trong Swift 2.0 là giống như một cuối cùng, có nghĩa là nhanh chóng đảm bảo bạn thực thi mã Hoãn ở phần cuối của phạm vi chức năng hiện hành. Dưới đây là một số điểm mà tôi cần phải biết: 1) Không có vấn đề thậm chí bảo vệ sẽ trở 2) chúng ta có thể viết nhiều phạm vi Hoãn

Dưới đây là ví dụ và đầu ra thể hiện nhiều trì hoãn:

func myMethod() { 
    print("Message one") 
    print("Message two") 
    print("Message three") 
    defer { 
     print("defered block 3") 
    } 
    defer { 
     print("defered block 2") 
    } 
    defer { 
     print("defered block 1") 
    } 
    print("Message four") 
    print("Message five") 

} 
Output: 
Message one 
Message two 
Message three 
Message four 
Message five 
defered block 1 
defered block 2 
defered block 3 
Các vấn đề liên quan