在 Swift 中将变量分配给下划线

Cos*_*ows 5 xcode swift

在研究了 stackoverflow 关于 Swift 中下划线的内容后,我明白下划线意味着 a) 忽略这个函数,b) 在使用该方法时可以省略参数名称。我不明白的是,如果我们将变量分配给下划线会发生什么?通过为变量分配下划线,这可以消除来自 Xcode 的编译器警告,该警告显示“初始化程序的结果未使用”,但如果您不以任何方式使用此变量,则不会显示警告。

这个变量是否仍然被创建并存储在内存中,或者是否被编译器一起忽略,就好像它是一行被注释掉的代码一样?

例如:

func test_ToDoItem_TakesTitle(){

        let firstToDoItem = ToDoItem(title: "First Instance Title")

        _ = ToDoItem(title: "First ToDoItem instance")

        XCTAssertEqual(firstToDoItem.title, "First Instance Title")

    }
Run Code Online (Sandbox Code Playgroud)

以下代码行是创建并存储在内存中还是被忽略:

 _ = ToDoItem(title: "First ToDoItem instance")
Run Code Online (Sandbox Code Playgroud)

希望这个问题有意义,因为我想注意 Xcode 中每块内存的使用方式。

vac*_*ama 1

此测试表明,当对象超出范围时,对象会被创建并销毁:

class ToDoItem {
    var title = ""

    init(title: String) {
        self.title = title
    }

    deinit {
        print("deinit \(title)")
    }
}

func test() {
    print("test")

    _ = ToDoItem(title: "First")
    _ = ToDoItem(title: "Second")

    print("end test")
}

func callTest() {
    print("calling test()...")
    test()
    print("back from test()")
}

callTest()
Run Code Online (Sandbox Code Playgroud)

输出:

calling test()...
test
end test
deinit Second
deinit First
back from test()
Run Code Online (Sandbox Code Playgroud)

扩展测试:

func test() {
    print("test")

    _ = ToDoItem(title: "Item 1")
    for i in 2...4 {
        _ = ToDoItem(title: "Item \(i)")
    }
    _ = ToDoItem(title: "Item 5")

    print("end test")
}
Run Code Online (Sandbox Code Playgroud)
calling test()...
test
deinit Item 2
deinit Item 3
deinit Item 4
end test
deinit Item 5
deinit Item 1
back from test()
Run Code Online (Sandbox Code Playgroud)

请注意,第 2、3 和 4 项在每次循环中超出范围时都会被取消初始化。当项目 1 和 5 完成后超出范围时,它们将被取消初始化test()


应用程序内部

正如 Dmitry Plotnikov 在他的回答中指出的那样,上述情况仅在 Swift Playground 中成立。在应用程序中,结果是:

calling test()...
test
deinit Item 1
deinit Item 2
deinit Item 3
deinit Item 4
deinit Item 5
end test
back from test()
Run Code Online (Sandbox Code Playgroud)

这告诉我们:

  1. 对象已创建。
  2. 他们立即被释放。