我正在阅读一本用 Swift 编写的 TDD 书籍,以了解如何使用该语言。我注意到在代码库中,某些对象不需要分配内存即可使用。例如,我们创建了一个名为 sut 的隐式解包可选,据我所知,它为此对象分配了内存,但实际上并没有创建它。但是在名为 setup 的方法中,我们创建并使用了一个 UIStoryboard 对象。我对为什么这是可能的以及为什么不需要为 UIStoryboard 对象分配内存感到困惑。这是代码:
import XCTest
@testable import ToDo
class ItemListViewControllerTests: XCTestCase {
var sut: ItemListViewController!
override func setUp() {
super.setUp()
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
sut = storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController
_ = sut.view
}
override func tearDown() {
super.tearDown()
}
func test_TableViewIsNotNil_AfterViewDidLoad() {
XCTAssertNotNil(sut.tableView)
}
func test_loadingView_LoadsTableViewAndSetsTableViewDataSource(){
XCTAssertTrue(sut.tableView.dataSource is ItemListDataProvider)
}
}
最佳答案
这个
var sut: ItemListViewController!
声明一个名为 sut
的属性,它是对 ItemListViewController
的引用。它不分配任何内存。
sut
是一个隐式展开的可选项,所以它只是一个普通的可选项,它可以是 nil
并且 Swift 不会提示它在初始化阶段没有被初始化。
由于属性将在对象生命周期的早期初始化(在测试的 setup
函数中)并且它不是有条件地初始化的,你“知道”它会有一个值(value)。
将其声明为隐式展开的可选意味着您不需要在每次使用变量时都展开它;您可以直接使用它,但就像任何其他强制解包一样,如果它 为 nil,您将遇到崩溃。
现在,这个:
let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
初始化 UIStoryboard
的实例并将其链接到您的包中的主 Storyboard,并且:
sut = storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController
实际上通过请求 Storyboard 对象执行分配 ItemListViewController
实例,使用具有标识符 ItemListViewController
的场景
关于ios - 为什么在 Swift 中初始化类时不需要所有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42429737/