2017-02-24 71 views
0

我正在通过用Swift编写的TDD书来学习如何使用该语言。我注意到,在代码库中,某些对象不需要分配内存以便使用。例如,我们创建了一个隐式解包的可选命名sut,其中我明白为该对象分配内存,但实际上并未创建它。但是,在名为setup的方法中,我们创建并使用了UIStoryboard对象。我很困惑,为什么这是可能的,为什么不需要为UIStoryboard对象分配内存。下面是代码:为什么Swift中的类初始化期间不需要所有对象?

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) 

    } 
} 
+0

您将'sut'分配给'storyboard.insta的结果ntiateViewController(withIdentifier:“ItemListViewController”)as! ItemListViewController'。你不需要自己分配任何内存,因为'instantiateViewController(withIdentifier :))'为你做了。 – Alexander

回答

1

你已经在做了,你声明let storyboard,这意味着创建故事板不变情况下,可以声明var sut意味着你创建变量实例,但功能的范围将允许您使用它在相同的测试类的其他功能,

你不需要在其他地方的故事板实例,所以你把它放在安装程序,因为它运行每次你运行一个测试,以创建新的sut,一个新的sut将确保它是独立的并没有什么改变其属性

3

var sut: ItemListViewController! 

声明了一个名为sut属性,它是一个ItemListViewController参考。它不分配任何内存。

sut是一个隐式解包的可选项,所以只是一个正常的可选项,它可以是nil并且Swift不会抱怨它在初始化阶段没有被初始化。因为该属性将在对象生命周期的早期初始化(在测试的setup函数中)并且它没有条件初始化,所以您“知道”它将具有值。

将其声明为隐式解包可选意味着您不必在每次使用时都保持解包变量;你可以使用它,但就像任何其他的力量解开,你会得到一个崩溃,如果它无。

现在,这样的:

let storyboard = UIStoryboard.init(name: "Main", bundle: nil) 

初始化的UIStoryboard一个实例,并在你的包它链接到主故事板,这:

sut = storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController 

实际执行ItemListViewController实例被分配要求故事板对象这样做,使用带有标识符的场景ItemListViewController

相关问题