在 Swift 中存储一个没有初始化的对象

Storing an Object without Initialization in Swift

当我通过测试驱动的开发练习来更好地理解如何初始化和使用对象时,我 运行 在一个测试用例中创建了一个对象,例如 UITableView但我不必使用 UITableView 的 init 函数。

这是代码示例:

import XCTest
@testable import PassionProject

class ItemListDataProviderTests: XCTestCase {

    var sut: ItemListDataProvider!
    var tableView: UITableView!

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.

        sut = ItemListDataProvider()
        tableView = UITableView()
        sut.itemManager = ItemManager()
        tableView.dataSource = sut
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func tests_numberOfSectionsIsTwo(){

        let numberOfSections = tableView.numberOfSections
        XCTAssertEqual(numberOfSections, 2)

    }

由于我正在学习 swift 语言和一般的 OOP,我知道初始化器有不同的风格,我假设为了使用一个实例,我们需要初始化它。但是在上面我能够创建一个 UITableView 实例并将它的内存存储在一个变量中。我什至被允许访问它的属性,例如 tableview.datasource.

我想知道,为了使用 class 的任何类型的实例,我的想法是否正确,它必须被初始化(如果默认情况下未设置存储的属性)?

通俗地说,我刚刚做了什么?我刚刚分配了内存吗?

我感到困惑的地方是在阅读 Apple 的文档时,这个 class 有一个我从来不必使用的初始化程序,因为我从来没有设置框架或样式:init(frame: CGRect, style: UITableViewStyle)

在此先感谢您的评论或回答。

表达式 UITableView() 调用 UITableView 的初始化程序。更一般地说,<someobject>() 调用不带任何参数的对象的初始化程序:

init() {
  //Initializer code goes here
}

你是正确的,为了在 Swift 中使用一个对象,你必须初始化它。这样做既为对象分配内存又对其进行初始化。在 Swift.

中,这两件事不能分开

在Objective-C中,分配和初始化对象是两个截然不同的步骤。您会到处看到语法 SomeObject *object = [[SomeObject alloc] init]。该代码调用 SomeObject class 的 alloc 方法为对象分配内存,然后向新分配的对象发送一个 init 方法,让对象初始化它的变量并进行其他设置。

在Swift中系统为你分配内存,调用init方法既为对象分配space并初始化它。