Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么所有对象都不是';在Swift中初始化类时是否需要?_Ios_Swift_Oop - Fatal编程技术网

Ios 为什么所有对象都不是';在Swift中初始化类时是否需要?

Ios 为什么所有对象都不是';在Swift中初始化类时是否需要?,ios,swift,oop,Ios,Swift,Oop,我正在读一本用Swift写的TDD书,学习如何使用这种语言。我注意到在代码库中,某些对象不需要为了使用而分配内存。例如,我们创建了一个名为sut的隐式解包可选对象,我知道它为这个对象分配内存,但实际上并没有创建它。但是在名为setup的方法中,我们创建并使用了ui-yboard对象。我不明白为什么这是可能的,为什么不需要为UIStoryboard对象分配内存。代码如下: import XCTest @testable import ToDo class ItemListViewControll

我正在读一本用Swift写的TDD书,学习如何使用这种语言。我注意到在代码库中,某些对象不需要为了使用而分配内存。例如,我们创建了一个名为sut的隐式解包可选对象,我知道它为这个对象分配内存,但实际上并没有创建它。但是在名为setup的方法中,我们创建并使用了ui-yboard对象。我不明白为什么这是可能的,为什么不需要为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)

    }
}

当您声明
let storyboard
时,您已经在这样做了,这意味着创建storyboard常量实例,您声明
var sut
意味着创建变量实例,但在函数范围之外,您可以在同一测试类的其他函数上使用它


您不需要在其他位置上使用情节提要实例,因此每次运行创建新的
sut
的测试时,您都会将其放入安装程序中,新的
sut
将确保它是独立的,并且没有任何更改其属性

您已经在按照声明执行
让情节提要
,这意味着创建情节提要常量实例,您声明
var sut
意味着您创建变量实例,但在函数范围之外,将允许您在同一测试类的其他函数上使用它

您不需要在其他位置使用脚本实例,因此每次运行创建新的
sut
的测试时,您都会将其放入安装程序中,新的
sut
将确保它是独立的,并且没有任何更改其属性

var sut: ItemListViewController!
声明名为
sut
的属性,该属性是对
ItemListViewController
的引用。它不分配任何内存

sut
是一个隐式展开的可选项,因此它只是一个普通可选项,可以是
nil
,Swift不会抱怨它在初始化阶段没有初始化

由于属性将在对象生命周期的早期初始化(在测试的
设置
函数中),并且它不是有条件地初始化的,因此您“知道”它将有一个值

将其声明为隐式展开的可选变量意味着您不需要每次使用变量时都继续展开它;你可以直接使用它,但就像任何其他力展开一样,如果它为零,你会得到崩溃

现在,这个:

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
初始化
UIStoryboard
的实例,并将其链接到捆绑包中的主情节提要,如下所示:

sut = storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController
实际执行
ItemListViewController
实例的分配,方法是使用标识符为
ItemListViewController
的场景,请求情节提要对象这样做

var sut: ItemListViewController!
声明名为
sut
的属性,该属性是对
ItemListViewController
的引用。它不分配任何内存

sut
是一个隐式展开的可选项,因此它只是一个普通可选项,可以是
nil
,Swift不会抱怨它在初始化阶段没有初始化

由于属性将在对象生命周期的早期初始化(在测试的
设置
函数中),并且它不是有条件地初始化的,因此您“知道”它将有一个值

将其声明为隐式展开的可选变量意味着您不需要每次使用变量时都继续展开它;你可以直接使用它,但就像任何其他力展开一样,如果它为零,你会得到崩溃

现在,这个:

let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
初始化
UIStoryboard
的实例,并将其链接到捆绑包中的主情节提要,如下所示:

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

实际执行
ItemListViewController
实例的分配,方法是使用标识符为
ItemListViewController

的场景,请求序列图像板对象这样做,您正在将
sut
序列图像板的结果分配给
storyboard.instanceeviewcontroller(标识符为:“ItemListViewController”)!ItemListViewController
。您不需要自己分配任何内存,因为
instanceeviewcontroller(带标识符:)
为您分配了内存。您将
sut
故事板的结果。instanceeviewcontroller(带标识符:“ItemListViewController”)分配为!ItemListViewController。您不需要自己分配任何内存,因为
instanceeviewcontroller(带标识符:)
为您分配了内存。