忽略返回值的Swift范围?

标签 swift scope return-value scoping

我有一个类似下面的函数

class Bar {
  deinit {
    print("Do some cleanup")
  }
}

func foo() -> Bar {
  return Bar()
}

Bar 的范围在这样调用时很清楚:

func useFoo() {
    let bar = foo()
    runFunctionA()
    // bar goes out of scope: "Do some cleanup" is printed
}

但是,当返回值被忽略时会发生什么,它会立即超出范围吗?

func useFoo() {
    let _ = foo()
    // "Do some cleanup" is printed here?
    runFunctionA()
    // "Do some cleanup" is printed here?
}

此外,使用 let _ = foo() 还是仅使用 _ = foo() 会有区别吗?

最佳答案

在第二种情况下,没有人获得返回对象的所有权,因此 ARC 立即释放该对象。因此,在 runFunctionA() 调用之前,您必须看到 Do some cleanup

此外,let _ = foo() 类似于 _ = foo

现在,当您必须在 playground 上查看不同的结果时,您一定在想我在写什么废话。

问题是,playgrounds 不是用来检查内存相关代码的。引用this .

如果您不相信我,请在实际项目中检查您的代码。我确实做到了。

栏:

class Bar {
    deinit {
        print("Do some cleanup")
    }

    class func foo() -> Bar {
        return Bar()
    }
}

View Controller :

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        useFoo()
        useFooAgain()
    }
    func useFoo() {
        let bar = Bar.foo()
        print("inside useFoo")
    }
    func useFooAgain() {
        let _ = Bar.foo()
        print("inside useFooAgain")
    }
}

输出:
在 useFoo 中
做一些清理工作
做一些清理工作
在 useFooAgain 里面

关于忽略返回值的Swift范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451326/

相关文章:

PHP 作用域解析运算符问题

python - 如何在 python 编写的 while 语句中获取返回值?

linux - 如果文件未更新,Wget 返回代码

SwiftUI 放大手势 onUpdate 不会在设备上立即触发(适用于模拟器)

swift - 每个 View Controller 在屏幕右侧都有空白

javascript - 在作用域链上声明一个变量

activerecord - 如何使用 Rails 3 范围过滤不存在​​关联记录的 habtm 连接表?

r - 在列中查找值返回 TRUE/FALSE

ios - 使用 UIBezierPath 创建带圆弧的圆(包含图像)

ios - 在保存到 coredata -Swift 之前检查数据是否存在