我对Swift语言很新,我有一个C#背景。
我想知道在swift语言中是否存在C#using语句的等效代码
using( var a = new MyClass()){
//Code Here
}
答案 0 :(得分:5)
Swift的自动引用计数保证了确定性的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.
}
您还可以使用延迟声明:
var a = MyClass()
defer { a.cleanUp() /* cleanup a however you wish */ }
您失去了使用像IDisposable
这样的界面的标准化,但是您可以通过执行任何您想要的代码获得通用性。
答案 1 :(得分:1)
刚刚学习Swift并提出了同样的问题。
我能得到的最接近的是:
if let UOW = (try UnitOfWork() as UnitOfWork?)
{
}
这是一个关于可选绑定的攻击,但似乎有效。你需要确保你的班级有一个deinit定义为亚历山大上面提到的。我发现即使我的init抛出异常,只要你退出IF语句的范围,仍然会调用deinit方法。
注意:如果适用,请确保使用弱引用,以确保您的deinit实际被调用!
使用DO块进行范围界定可能更加快速:
do
{
let UOW = try UnitOfWork()
// your code here
}
这有利于避免使用伪使用块的“厄运金字塔”(就像你将进入c#)