【问题标题】:Storing an Object without Initialization in Swift在 Swift 中存储没有初始化的对象
【发布时间】:2017-01-12 00:01:36
【问题描述】:

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

我想知道我是否正确地认为为了使用任何类型的类的实例,它必须被初始化(如果默认情况下未设置存储的属性)?

用外行的话来说,我刚刚做了什么?我刚刚分配了内存吗?

让我感到困惑的是,在阅读 Apple 的文档时,这个类有一个我从未使用过的初始化程序,因为我从未设置框架或样式:init(frame: CGRect, style: UITableViewStyle)

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

【问题讨论】:

    标签: ios swift oop xctest


    【解决方案1】:

    表达式 UITableView() 调用 UITableView 的初始化程序。更一般地说,<someobject>() 调用不带任何参数的对象的初始化程序:

    init() {
      //Initializer code goes here
    }
    

    你是正确的,为了在 Swift 中使用一个对象,你必须初始化它。这样做既为对象分配内存并对其进行初始化。这两件事在 Swift 中是分不开的。

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

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

    【讨论】:

    • 谢谢你,这是有道理的。我感到困惑的地方是在阅读 Apple 的文档时,这个类有一个我从未使用过的初始化程序,因为我从未设置框架或样式:init(frame: CGRect, style: UITableViewStyle)
    • 根据我自己的理解和查看 Apple 的文档,UITableView 的 init 方法有两个不是可选的属性。所以我的意思是我从未设置这些属性或调用 init 方法,但我的测试用例仍然能够使用我相信的对象。
    • designated初始化器的概念,它是一个类的所有其他初始化器都应该调用的初始化器。我相信对于像UITableViewController 这样的UIView 子类,您应该调用init(frame:style:)init(coder:)
    • 你确实调用了一个 init 方法。你打电话给init()。您没有调用 init(frame:style:)init(coder:),但确实调用了 an 初始化程序。
    • 您应该拨打init(frame:style:)init(coder:)。请参阅此链接:stackoverflow.com/questions/7126726/…(为 Objective-C 编写但仍然相关)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2014-07-27
    • 2020-03-26
    • 2020-01-03
    • 2020-03-05
    • 2023-04-02
    • 2015-03-04
    相关资源
    最近更新 更多