2016-12-30 33 views
5

我對Swift語言很陌生,我有一個C#背景。C#在Swift中使用語句等效

,我不知道是否有在迅速語言using語句C#的等效代碼

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

你應該解釋'使用'的作用。不要指望Swift程序員知道在出口 –

+0

上''使用'清理'a'實際上,你*有*解釋使用並不能確保清理代碼被調用。 –

+0

@PanagiotisKanavos這正是使用。它調用Dispose(),沒有別的。 – Alexander

回答

5

雨燕的自動引用計數保證確定性deinitalization(不像CLR的垃圾收集器),所以你可以把清理代碼在你的班級'deinit方法。這與C++中的RAII完全相同。即使引發異常,此技術也能正常工作。

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. 
} 

你也可以使用一個defer語句:

​​

你失去了使用界面像IDisposable的標準化,但你在能夠執行任意你想要的代碼獲得普遍性。

+0

這不等同。即使存在異常,使用'將在退出塊時調用類的Dispose方法。使用'defer'你必須手動編寫清理代碼 –

+1

Panagiotis,你必須在你的'Dispose'重載中手動寫入。我沒有看到你的觀點。 – Bauss

+0

@Bauss應該清楚。 Dispose是一個類方法,*可以*清理內部字段,因爲它可以訪問它們。推遲你必須重複清理代碼。範圍也是不同的。 'using'確保''Dispose'在你退出它的塊後立即被調用。 「延期」並沒有給出這樣的保證。一旦不再需要,您可以使用'using'關閉連接。你不能這樣做推遲 –

1

剛學Swift,想出了同樣的問題。

我能得到的最接近的是這樣的:

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


    } 

這是對可選綁定一個黑客位,但似乎工作。你需要確保你的班級有一個被亞歷山大稱爲上面定義的deinit。我發現,即使我的init拋出一個異常,只要你超出IF語句的範圍,deinit方法仍然會被調用。

注意:請確保您使用弱引用(如果適用)以確保您的deinit實際上被調用!

這可能是更SWIFTY使用DO塊的範圍界定:

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

其中有使用塊避免「厄運的金字塔」你僞的利益(比如您將獲得在C# )