【问题标题】:Is it Possible to Limit Scope in Swift? [duplicate]是否可以在 Swift 中限制范围? [复制]
【发布时间】:2015-01-27 18:05:11
【问题描述】:

像大多数语言一样,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 中的变量范围?

【问题讨论】:

  • 可变范围 != "cost"
  • @user2864740 你能澄清你的意思吗?您是否暗示使用闭包等不适合作为这样做的手段?他们不会编译吗?

标签: swift


【解决方案1】:

我这样做,在操场上工作:

var foo = "bar"

let _ = {() -> () in
   var foo = "nope"
   println(foo)
}()

println(foo)

【讨论】:

    【解决方案2】:

    我所做的是定义一个匿名函数并执行它。

    {
        () -> () in
        var newItems = []
        while let newItem = foobar() { newItems.append(newItem) }
        // Process newItems into results so we can add them
        results += newItems
    }()
    

    您可能必须在上一行的末尾加一个分号,这样 Swift 就不会认为这是一个“尾随闭包”。

    【讨论】:

    • 我不认为编译。
    • 这也行不通。你必须把它分配给一些东西。
    • 在你的闭包之前放一个变量声明,然后看看它是否有效。
    • 如果上一行的状态会影响您当前的代码,比如它需要一个分号,我会称之为损坏。分配给一个 _ ,问题就没有了。就像没有“这行得通……但是”需要。它只是工作。
    猜你喜欢
    • 2020-11-25
    • 2014-08-24
    • 2017-01-22
    • 2019-01-23
    • 2012-01-11
    • 2017-03-11
    • 2018-06-21
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多