2017-01-12 4 views
0

Während ich eine testgetriebene Entwicklungsübung durchführe, um besser zu verstehen, wie Objekte initialisiert und verwendet werden können, habe ich einen Testfall durchlaufen, in dem ich ein Objekt wie a UITableView, aber ich musste nicht die init-Funktion von UITableView verwenden. HierSpeichern eines Objekts ohne Initialisierung in Swift

ist ein Beispiel für den Code:

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) 

    } 

Als ich die rasche Sprache und OOP im Allgemeinen lerne, ich weiß initializers in verschiedenen Geschmacksrichtungen kommen und ich nahm an, dass, um eine Instanz verwenden wir muss es initialisieren. Wie auch immer, ich konnte eine UITableView-Instanz erstellen und den Speicher in einer Variablen speichern. Ich durfte sogar auf Eigenschaften wie tableview.datasource zugreifen.

Ich würde gerne wissen, bin ich richtig in der Annahme, dass, um Instanz jeder Art von Klasse zu verwenden, muss es initialisiert werden (wenn die gespeicherten Eigenschaften nicht standardmäßig festgelegt sind)?

Was habe ich nur in Laien ausgedrückt? Habe ich nur den Speicher reserviert?

Wo ich wurde verwirrt ist beim Lesen von Apples Dokumentation, diese Klasse einen Initialisierer hat, die ich musste nie benutzen, weil ich nie den Rahmen oder den Stil festgelegt: init (Rahmen: CGRect, style: UITableViewStyle)

Dank im voraus für das Kommentieren oder Beantworten.

Antwort

5

Der Ausdruck UITableView() ruft den Initialisierer für UITableView auf. Ganz allgemein ruft <someobject>() die Initialisierer für das Objekt, das keine Parameter übernehmen:

init() { 
    //Initializer code goes here 
} 

Sie sind richtig, dass, um ein Objekt in Swift verwenden Sie es zu initialisieren haben. Auf diese Weise wird der Speicher für das Objekt reserviert und initialisiert. Diese zwei Dinge können nicht in Swift getrennt werden.

In Objective-C sind das Zuordnen und Initialisieren von Objekten zwei verschiedene Schritte. Sie werden überall die Syntax SomeObject *object = [[SomeObject alloc] init] sehen. Dieser Code ruft die Zuweisungsmethode der Klasse SomeObject auf, um Speicher für das Objekt zuzuweisen, und sendet dann dem neu zugeordneten Objekt eine init-Methode, mit der das Objekt seine Variablen initialisiert und andere Einstellungen vornehmen kann.

In Swift reserviert das System den Speicher für Sie, und das Aufrufen einer Init-Methode reserviert Speicherplatz für das Objekt und initialisiert es.

+0

Danke und das macht Sinn. Wo ich verwirrt wurde, wenn ich Apples Dokumentation lese, hat diese Klasse einen Initialisierer, den ich nie benutzen musste, weil ich nie den Rahmen oder den Stil gesetzt habe: init (frame: CGRect, style: UITableViewStyle) –

+0

Von meinem eigenen Verständnis und Blick Apples Dokumentation, die Init-Methode für UITableView hat zwei Eigenschaften, die nicht optional sind. Also, was ich sage ist, dass ich nie diese Eigenschaften gesetzt oder die Init-Methode aufgerufen habe, aber mein Testfall war immer noch in der Lage, das Objekt zu benutzen, von dem ich glaube. –

+0

Es gibt das Konzept des Initiators * designed *, der Initialisierer, den alle anderen Initialisierer für eine Klasse aufrufen sollen. Ich glaube, dass Sie für 'UIView'-Unterklassen wie' UITableViewController' entweder 'init (frame: style:) 'oder' init (coder:) '' –

Verwandte Themen