ios - 为什么在 Swift 中初始化类时不需要所有对象?

标签 ios swift oop

我正在阅读一本用 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/

相关文章:

ios - Swift 中是否有 API 可以确定 iOS 设备的处理器寄存器大小?

iOS - 滑动删除,同时还允许移动行

ios - 使用指针搜索 Parse 返回错误 "pointer field needs a pointer value"

swift - 如何将 View TableViewCell 转换为 UIGestureView

ios - .rangeOfString() 在 Swift 中带有开关

java - 访问抽象类方法

swift - 为通用协议(protocol)实现提供具体类型

ios - 从 AFHTTPSessionManager 获取数据

python - python中的类默认参数

ios - ionic 本地存储不会持久存在于设备上