2017-01-12 1 views
0

객체를 초기화하고 사용하는 방법을 더 잘 이해하기 위해 테스트 중심 개발 연습을하고 있습니다. 테스트 케이스에서 UITableView하지만 초기화 함수를 사용할 필요가 없습니다. 여기 초기화하지 않고 객체를 Swift에 저장

코드의 샘플입니다

나는 일반적으로 빠른 언어와 OOP를 배우고으로
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와 같은 속성에 액세스 할 수있었습니다.

나는 어떤 종류의 클래스의 인스턴스를 사용하기 위해서 그것이 (저장 프로퍼티가 디폴트로 설정되지 않으면) 초기화되어야한다고 생각하는 것이 맞을까?

내가 평신도 용어로 한 것은 무엇입니까? 방금 메모리를 할당 했나요? 초기화 (프레임 : CGRect, 스타일 : UITableViewStyle)

덕분에 애플의 문서를 읽는 것은,이 클래스가 나는 프레임이나 스타일을 설정하지 않기 때문에 사용할 수 없었 이니셜 라이저가있을 때 나는 혼동되었다

입니다 미리 의견을 말하거나 응답 할 수 있습니다.

답변

5

UITableView()은 UITableView의 초기화 프로그램을 호출합니다. 보다 일반적인 관점에서, <someobject>()는 매개 변수를 사용하지 않는 개체에 대한 초기화를 호출

init() { 
    //Initializer code goes here 
} 

당신은 스위프트의 객체를 사용하기 위해, 당신이 그것을 initalize해야한다는 정확합니다. 이렇게하면 객체에 대한 메모리가 할당되고 초기화됩니다. 그 두 가지는 스위프트에서 분리 될 수 없습니다.

Objective-C 할당 및 개체 초기화에는 두 가지 단계가 있습니다. 구문 SomeObject *object = [[SomeObject alloc] init]이 모든 곳에서 표시됩니다. 이 코드는 SomeObject 클래스의 alloc 메서드를 호출하여 개체에 메모리를 할당 한 다음 새로 할당 된 개체에 init 메서드를 보내 개체가 변수를 초기화하고 다른 설정을 수행하도록합니다.

Swift에서 시스템이 메모리를 할당하고 init 메소드를 호출하면 객체 공간을 할당하고 초기화합니다.

+0

감사합니다. 내가 혼란스러워 할 때 애플의 문서를 읽을 때,이 클래스는 결코 프레임이나 스타일을 설정하지 않았기 때문에 결코 사용하지 않아도되는 이니셜 라이저를 가지고있다 : init (frame : CGRect, style : UITableViewStyle) –

+0

내 자신의 이해와보고 Apple의 설명서에서 UITableView의 init 메서드에는 선택적인 두 가지 속성이 있습니다. 그래서 내가 말하고자하는 것은 내가 그 속성들을 설정하지 않았거나 init 메소드라고 불렀지 만, 나의 테스트 케이스는 여전히 내가 믿는 객체를 사용할 수 있었다. –

+0

* 지정된 * 초기화 프로그램의 개념이 있습니다.이 초기화 프로그램은 클래스의 다른 모든 초기화 프로그램이 호출해야하는 초기화 프로그램입니다. 나는'UITableViewController'와 같은'UIView' 서브 클래스에 대해'init (frame : style :)'또는'init (coder :)'를 호출한다고 가정합니다. –

관련 문제