Ios 在Swift中存储未初始化的对象

Ios 在Swift中存储未初始化的对象,ios,swift,oop,xctest,Ios,Swift,Oop,Xctest,当我在进行测试驱动开发练习以更好地理解如何初始化和使用对象时,我遇到了一个测试用例,其中我创建了一个对象,例如UITableView,但我不必使用UITableView的init函数 以下是代码示例: import XCTest @testable import PassionProject class ItemListDataProviderTests: XCTestCase { var sut: ItemListDataProvider! var tableView: U

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

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

我刚才用外行的话说做了什么?我只是分配了内存吗

我感到困惑的是,在阅读苹果的文档时,这个类有一个我从未使用过的初始值设定项,因为我从未设置frame或style:init(frame:CGRect,style:UITableViewStyle)


提前感谢您的评论或回答。

表达式
UITableView()
调用UITableView的初始值设定项。在更一般的术语中,
()
调用不带任何参数的对象的初始值设定项:

init() {
  //Initializer code goes here
}
为了在Swift中使用对象,您必须初始化它,这是正确的。这样做会为对象分配内存并初始化它。这两件事在斯威夫特是分不开的

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


在Swift中,系统为您分配内存,调用init方法既为对象分配空间,又对其进行初始化。

谢谢,这很有意义。我感到困惑的是,在阅读苹果的文档时,这个类有一个我从未使用过的初始值设定项,因为我从未设置框架或样式:init(frame:CGRect,style:UITableViewStyle)。根据我自己的理解,查看苹果的文档,UITableView的init方法有两个属性不是可选的。所以我要说的是,我从未设置这些属性或调用init方法,但我的测试用例仍然能够使用我相信的对象。有一个指定的初始值设定项的概念,它是一个类的所有其他初始值设定项都应该调用的初始值设定项。我相信对于
UIView
子类,比如
UITableViewController
,您应该调用
init(frame:style:)
或者
init(coder:)
您确实调用了init方法。您调用了
init()
。您没有调用
init(frame:style:)
init(coder:)
,但确实调用了初始值设定项。您应该调用
init(frame:style:)
init(coder:)
。参见此链接:(为Objective-C编写,但仍然相关)