2016-12-30 55 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# )