没有catch块的“do语句”是什么意思?

11

在阅读Programming iOS 12时,我遇到了几个没有catch块do语句示例代码,如下所示:

    do {
        let mars = UIImage(named:"Mars")!
        let sz = mars.size

        let r = UIGraphicsImageRenderer(size:CGSize(sz.width*2, sz.height), format:mars.imageRendererFormat)
        self.iv1.image = r.image { _ in
            mars.draw(at:CGPoint(0,0))
            mars.draw(at:CGPoint(sz.width,0))
        }
    }

    // ======

    do {
        let mars = UIImage(named:"Mars")!
        let sz = mars.size

        let r = UIGraphicsImageRenderer(size:CGSize(sz.width*2, sz.height*2), format:mars.imageRendererFormat)
        self.iv2.image = r.image { _ in
            mars.draw(in:CGRect(0,0,sz.width*2,sz.height*2))
            mars.draw(in:CGRect(sz.width/2.0, sz.height/2.0, sz.width, sz.height), blendMode: .multiply, alpha: 1.0)
        }
    }

如果有人能够解释没有 catch 块的 do 语句的目的,我将不胜感激。


2个回答

11

这是新的代码范围:因此,如果您想要重用变量名,可以使用许多do语句。就像您问题中的片段一样,变量marsszr存在于两个范围中而不会出错。

do语句可以被标记,这使您能够退出该范围:

scopeLabel: do {
    for i in 0..<10 {
        for j in 0..<20 {
            if i == 2, j == 15 {
                break scopeLabel
            }
            else {
                print(i,j)
            }
        }
    }
}

想了解更多细节,请看这里


5

由于这里没有引起错误的内容,所以使用这段代码,写手可以复制粘贴同样的内容而不需要更改变量名,因为变量作用域在 do 块中。

我不支持这种方式,他应该创建一个函数来避免重复的代码,这样它将具有自己的作用域。


非常感谢您提供的绝佳技巧。 - gbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接