Swift范围被忽略的返回值?

时间:2017-11-23 09:00:39

标签: 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()会有所作为吗?

1 个答案:

答案 0 :(得分:1)

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

此外,let _ = foo()_ = foo

类似

现在,当你必须在游乐场看不同的结果时,你一定在想我写的废话。

问题是,游乐场不是用于检查与内存相关的代码。请参阅this

如果您不信任我,只需在实际项目中检查您的代码。我确定。

<强>栏:

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

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

<强>的ViewController:

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")
    }
}

<强>输出:
里面使用福佑 做一些清理 做一些清理 在里面使用富有想法