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

时间:2017-01-12 00:01:36

标签: ios swift oop xctest

当我正在进行测试驱动的开发练习以更好地理解如何初始化和使用对象时,我遇到了一个测试用例,我创建了一个对象,例如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)

    }

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

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

我在外行人的条件下做了什么?我只是分配了内存吗?

当我感到困惑的是,在阅读Apple的文档时,这个类有一个我从未使用的初始化程序,因为我从未设置框架或样式:init(框架:CGRect,样式:UITableViewStyle)

提前感谢您发表评论或回答。

1 个答案:

答案 0 :(得分:5)

表达式UITableView()为UITableView调用初始值设定项。更一般地说,<someobject>()为该对象调用不带任何参数的初始值设定项:

init() {
  //Initializer code goes here
}

你是正确的,为了在Swift中使用一个对象,你必须将它初始化。这样做既可以为对象分配内存并进行初始化。这两件事在Swift中无法分开。

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

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