我对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