像大多数语言一样,Swift支持条件,循环等范围内的有限范围的变量,但是它似乎并不支持单独的块,这是一种耻辱,因为我发现它是一种非常有用的方法来限制变量的范围,特别是对于函数的全长可能需要的昂贵的变量。
例如,我可能会做一些事情(以Swift为例,因为目前不会编译):
var results = []
while let newResult = someFunction() { results.append(newResult) }
{
var newItems = []
while let newItem = foobar() { newItems.append(newItem) }
// Process newItems into results so we can add them
results += newItems
}
// Do some more stuff down here
它对于常见的占位符名称也非常方便,但在执行的不同部分可能有不同的类型。虽然我可以声明不同的名称,但它实际上最终会比仅重复使用具有明显标记范围的良好变量名称更令人困惑或更混乱。
当然我可以做if true {}
之类的事情来作弊,但似乎没必要。那么有没有办法可以声明一个范围/块而不必放入条件?
我知道它可能与闭包的形成方式有关,但有没有办法做这样的事情纯粹是为了限制Swift中的变量范围?
答案 0 :(得分:0)
我所做的是定义一个匿名函数并执行它。
{
() -> () in
var newItems = []
while let newItem = foobar() { newItems.append(newItem) }
// Process newItems into results so we can add them
results += newItems
}()
你可能不得不在前一行的末尾添加一个分号,因此Swift认为这不是一个“尾随闭包”。
答案 1 :(得分:0)
我这样做,在操场上工作:
var foo = "bar"
let _ = {() -> () in
var foo = "nope"
println(foo)
}()
println(foo)