当我正在进行测试驱动的开发练习以更好地理解如何初始化和使用对象时,我遇到了一个测试用例,我在其中创建了一个对象,例如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)
提前感谢您的评论或回答.
该表达式UITableView()
为UITableView调用初始化程序.更一般地说,
为不带任何参数的对象调用初始值设定项:
init() { //Initializer code goes here }
你是正确的,为了在Swift中使用一个对象,你必须将它初始化.这样做既可以为对象分配内存并进行初始化.这两件事在Swift中是无法分开的.
在Objective-C中,分配和初始化对象是两个不同的步骤.你会看到SomeObject *object = [[SomeObject alloc] init]
整个地方的语法.该代码调用SomeObject
类的alloc方法为对象分配内存,然后向新分配的对象发送一个init方法,该方法允许对象初始化它的变量并进行其他设置.
在Swift中,系统为您分配内存,并调用init方法为对象分配空间并初始化它.