我對Swift語言很陌生,我有一個C#背景。C#在Swift中使用語句等效
,我不知道是否有在迅速語言using語句C#的等效代碼
using(var a = new MyClass()){
//Code Here
}
我對Swift語言很陌生,我有一個C#背景。C#在Swift中使用語句等效
,我不知道是否有在迅速語言using語句C#的等效代碼
using(var a = new MyClass()){
//Code Here
}
雨燕的自動引用計數保證確定性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
的標準化,但你在能夠執行任意你想要的代碼獲得普遍性。
這不等同。即使存在異常,使用'將在退出塊時調用類的Dispose方法。使用'defer'你必須手動編寫清理代碼 –
Panagiotis,你必須在你的'Dispose'重載中手動寫入。我沒有看到你的觀點。 – Bauss
@Bauss應該清楚。 Dispose是一個類方法,*可以*清理內部字段,因爲它可以訪問它們。推遲你必須重複清理代碼。範圍也是不同的。 'using'確保''Dispose'在你退出它的塊後立即被調用。 「延期」並沒有給出這樣的保證。一旦不再需要,您可以使用'using'關閉連接。你不能這樣做推遲 –
剛學Swift,想出了同樣的問題。
我能得到的最接近的是這樣的:
if let UOW = (try UnitOfWork() as UnitOfWork?)
{
}
這是對可選綁定一個黑客位,但似乎工作。你需要確保你的班級有一個被亞歷山大稱爲上面定義的deinit。我發現,即使我的init拋出一個異常,只要你超出IF語句的範圍,deinit方法仍然會被調用。
注意:請確保您使用弱引用(如果適用)以確保您的deinit實際上被調用!
這可能是更SWIFTY使用DO塊的範圍界定:
do
{
let UOW = try UnitOfWork()
// your code here
}
其中有使用塊避免「厄運的金字塔」你僞的利益(比如您將獲得在C# )
你應該解釋'使用'的作用。不要指望Swift程序員知道在出口 –
上''使用'清理'a'實際上,你*有*解釋使用並不能確保清理代碼被調用。 –
@PanagiotisKanavos這正是使用。它調用Dispose(),沒有別的。 – Alexander