2017-01-12 2 views
0

Поскольку я работаю над тестом на основе теста, чтобы лучше понять, как объекты могут быть инициализированы и использованы, я столкнулся с тестовым примером, где я создаю объект, такой как UITableView, но мне не пришлось использовать функцию init UITableView.Хранение объекта без инициализации в 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) 

    } 

Как я учусь на быстром языке и ООП в целом, я знаю Инициализаторы бывают разные вкусы и я предположил, что для того, чтобы использовать экземпляр мы необходимо будет инициализировать его. Однако выше я смог создать экземпляр UITableView и сохранить его память внутри переменной. Мне даже разрешили доступ к его свойствам, таким как tableview.datasource.

Я хотел бы знать, правильно ли я считаю, что для использования экземпляра любого типа класса он должен быть инициализирован (если сохраненные свойства не установлены по умолчанию)?

Что я только что делал в условиях неспециалиста? Я просто выделил память?

Где я растерялся, когда чтение документации Apple, этот класс имеет инициализатора, который я никогда не приходилось использовать, потому что я никогда не ставил кадр или стиль: Init (кадр: CGRect, стиль: UITableViewStyle)

спасибо заранее для комментирования или ответа.

ответ

5

Выражение UITableView() вызывает инициализатор для UITableView. В более общем плане, <someobject>() вызывает инициализатор для этого объекта, который не принимает никаких параметров:

init() { 
    //Initializer code goes here 
} 

Вы правы, что для того, чтобы использовать объект в Swift, вы должны инициализировать его. При этом оба выделяют память для объекта и инициализируют его. Эти две вещи нельзя разделить в Свифт.

В Objective-C выделение и инициализация объектов - это два разных шага. Вы увидите синтаксис SomeObject *object = [[SomeObject alloc] init] повсюду. Этот код вызывает метод выделения класса SomeObject для выделения памяти для объекта и затем отправляет вновь выделенный объект методом init, который позволяет объекту инициализировать его переменные и выполнять другую настройку.

В Swift система выделяет для вас память, а вызов метода init выделяет пространство для объекта и инициализирует его.

+0

Спасибо, и это имеет смысл. Когда я запутался, когда читал документацию Apple, у этого класса есть инициализатор, который мне никогда не приходилось использовать, потому что я никогда не устанавливал фрейм или стиль: init (frame: CGRect, style: UITableViewStyle) –

+0

Из моего собственного понимания и просмотра Документация Apple, метод init для UITableView имеет два свойства, которые не являются необязательными. Так что я говорю, что я никогда не устанавливал эти свойства или не вызывал метод init, но мой тестовый пример все еще был в состоянии использовать объект, который я считаю. –

+0

Существует концепция инициализатора * назначенного *, который является инициализатором, который должен вызывать все другие инициализаторы для класса. Я считаю, что для подклассов 'UIView', таких как' UITableViewController', вы должны вызывать либо 'init (frame: style:)', либо 'init (coder:)' –

Смежные вопросы