2017-01-12 31 views
0

當我正在完成一個測試驅動的開發練習以更好地理解對象如何被初始化和使用時,我已經運行了一個測試用例,其中創建了一個對象,如UITableView,但我不必使用UITableView的init函數。在Swift中存儲沒有初始化的對象

下面是代碼樣本:

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) 

    } 

,因爲我學習一般迅速語言和OOP,我知道初始化有不同的口味,我認爲爲了使用一個實例,我們將需要初始化它。然而,上面我能夠創建一個UITableView實例並將其內存存儲在一個變量中。我甚至被允許訪問它的屬性,如tableview.datasource。

我想知道我是否正確認爲要使用任何類型的實例,它必須被初始化(如果存儲的屬性沒有默認設置)?

我剛纔在外行人中做了些什麼?我只是分配內存?

當我開始困惑是,當閱讀蘋果文檔,這個類有一個初始化,我從未使用過,因爲我從來沒有設置幀或風格:初始化(幀:的CGRect,風格:UITableViewStyle)

謝謝提前進行評論或回答。

回答

5

表達式UITableView()爲UITableView調用初始值設定項。更一般地說,<someobject>()調用初始化爲對象,不帶任何參數:

init() { 
    //Initializer code goes here 
} 

你是正確的,爲了使用斯威夫特一個對象,你必須initalize它。這樣做既爲對象分配內存並對其進行初始化。這兩件事在Swift中是分不開的。

在Objective-C中分配和初始化對象是兩個不同的步驟。您會在整個地方看到語法SomeObject *object = [[SomeObject alloc] init]。該代碼調用SomeObject類的alloc方法爲對象分配內存,然後將新分配的對象發送給init方法,以便對象初始化變量並執行其他設置。

在Swift中,系統爲你分配內存,調用init方法爲對象分配空間並初始化它。

+0

謝謝你,這是有道理的。當我讀到Apple的文檔時,這個類有一個我從來沒有用過的初始化器,因爲我從來沒有設置框架或樣式:init(frame:CGRect, style:UITableViewStyle) –

+0

從我自己的理解和看待Apple的文檔,UITableView的init方法有兩個不可選的屬性。所以我說的是我從來沒有設置這些屬性或稱爲init方法,但我的測試用例仍然能夠使用我相信的對象。 –

+0

* *指定*初始值設定項的概念,它是一個類的所有其他初始值設定項應該調用的初始值設定項。我相信對於像'UITableViewController'這樣的'UIView'子類,你應該調用'init(frame:style:)'或'init(coder:)' –