2016-12-30 24 views
5

Tôi rất mới đối với ngôn ngữ Swift, tôi có Nền C#.C# sử dụng Tương đương với tuyên bố trong Swift

và tôi tự hỏi nếu có một mã số tương đương cho C# sử dụng tuyên bố trong ngôn ngữ nhanh chóng

using(var a = new MyClass()){ 
//Code Here 
} 
+0

Bạn nên giải thích 'sử dụng' làm gì. Đừng nghĩ rằng các lập trình viên Swift biết rằng 'using' đang dọn dẹp' a' trên lối ra –

+0

Thực ra, bạn * có * để giải thích rằng việc sử dụng không chỉ đảm bảo mã dọn dẹp được gọi. –

+0

@PanagiotisKanavos Đó chính xác là những gì sử dụng. Nó gọi là 'Dispose() ', không có gì khác. – Alexander

Trả lời

5

tính tham khảo tự động Swift đảm bảo deinitalization xác định (không giống như thu gom rác của CLR), do đó bạn có thể đặt làm sạch mã trong phương thức 'deinit' của lớp học. Điều này là chính xác như RAII trong C++. Kỹ thuật này hoạt động ngay cả khi một ngoại lệ được ném ra.

class MyClass() { 
    var db = openDBConnection() //example resource 

    deinit() { 
     db.close() 
    } 
} 

func foo() { 
    var a = MyClass() 
    print(a) // do stuff with a 

    // the (only) reference, a, will go out of scope, 
    // thus the instance will be deinitialized. 
} 

Bạn cũng có thể sử dụng một tuyên bố Hoãn:

var a = MyClass() 
defer { a.cleanUp() /* cleanup a however you wish */ } 

Bạn mất tiêu chuẩn của việc sử dụng một giao diện giống như IDisposable, nhưng bạn có được tính tổng quát trong việc có thể thực hiện bất cứ điều gì mã bạn muốn.

+0

Điều đó không tương đương. 'using' sẽ gọi phương thức' Dispose' của lớp khi thoát khỏi khối, ngay cả khi có một ngoại lệ. Với 'defer' bạn phải tự viết mã dọn dẹp –

+1

Panagiotis, bạn phải viết nó theo cách thủ công trong quá tải' Dispose' của bạn. Tôi không thấy quan điểm của bạn. – Bauss

+0

@ Làm phiền nó phải rõ ràng. Vứt bỏ là một phương thức lớp * có thể * dọn dẹp các trường nội bộ vì nó có quyền truy cập vào chúng.Với trì hoãn bạn phải lặp lại mã dọn dẹp. Ngoài ra phạm vi là khác nhau. 'using' đảm bảo rằng' Dispose' được gọi ngay khi bạn thoát khỏi khối của nó. 'trì hoãn 'không bảo đảm như vậy. Bạn có thể sử dụng 'using' để đóng kết nối ngay khi bạn không còn cần nó nữa. Bạn không thể làm tương tự với việc trì hoãn –

1

Chỉ cần học Swift và đưa ra cùng một câu hỏi.

Gần nhất tôi có thể nhận được điều này:

if let UOW = (try UnitOfWork() as UnitOfWork?) 
    { 


    } 

Đó là một chút của một hack vào tùy chọn ràng buộc nhưng dường như làm việc. Bạn sẽ cần phải chắc chắn rằng lớp của bạn có một deinit được định nghĩa như được gọi ra bởi Alexander. Tôi thấy rằng ngay cả khi init của tôi ném một ngoại lệ, phương thức deinit vẫn được gọi ngay khi bạn ra khỏi phạm vi trên câu lệnh IF.

LƯU Ý: Đảm bảo bạn đang sử dụng các tham chiếu yếu nếu có thể để đảm bảo deinit của bạn thực sự được gọi!

Nó có lẽ là hơn Swifty sử dụng một khối DO cho Phạm vi của bạn:

do 
{ 
    let UOW = try UnitOfWork() 
    // your code here 
} 

Trong đó có các lợi ích của việc tránh một "kim tự tháp của doom" với giả của bạn sử dụng các khối (như bạn sẽ nhận được trong C#)

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