2014-11-19 3 views
3

UITableViewController을 신속하게 덮어 씁니다.이 중 두 개의 필수 변수는 다음을 사용하여 초기화됩니다. Error in Swift class: Property not initialized at super.init call :이 이후 selfweak 참조 UITableViewDataSource 프로토콜을 구현하고 나를 여기에 설명 된대로 예상된다 Property not initialized at super.init call 에러주고있다으로 이제 문제는 그 tableView 재산Swift 클래스의 오류 : super.init에서 초기화되지 않은 속성 - 초기화 매개 변수에서 self를 사용해야하는 속성을 초기화하는 방법

class VideosListViewController: UITableViewController { 

    required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.datasourceOfflineVideos = ASDataSource(tableViewController: self) 
    self.datasourceOnlineVideos = ASDataSource(tableViewController: self) 
    } 

    // MARK: - Variables 
    var datasourceOnlineVideos:ASDataSource 
    var datasourceOfflineVideos:ASDataSource 
    } 

를 사용하는 self 참조가 필요하는 데 사용됩니다.

스위프트의 컴파일러는 두 단계의 초기화가 오류없이 완료되었는지 확인하기 위해 네 도움이 안전 검사를 수행

지정된 초기화는 클래스에 의해 도입 된 "모든 속성이 초기화되어 있는지 확인해야합니다 체크 한 안전 슈퍼 클래스 이니셜 라이저에 위임하기 전에

발췌 : Apple Inc.의 "Swift Programming Language". iBooks. https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

그래서 내 질문은 :

는 신속 클래스의 인스턴스 변수 내가 그렇게 할 수있는 방법, 여기 ASDataSource 형태 변수처럼 초기화 할 self 참조를 필요로하는 경우? 빠른 날 현재 내가 사용하고 super.init()

를 호출하기 전에 init()의 초기화 내에서 사용자 self에 저를 허용하지 않는 모든 인스턴스 변수를 initiazing 전에 super.init() 전화를 허용하지 않기 때문에

문제를 해결하기위한 선택적 변수. 그러나 학습 목적을 위해 나는 그것을 어떻게하는지 알고 싶습니다. 당신은 당신의 초기화의 순서는 super.init/속성 반전이 사전 :

답변

9

에 감사 :

required init(coder aDecoder: NSCoder) { 
    self.datasourceOfflineVideos = ASDataSource(tableViewController: self) 
    self.datasourceOnlineVideos = ASDataSource(tableViewController: self) 
    super.init(coder: aDecoder) 
    } 

인스턴스 속성은 슈퍼 클래스의 초기화를 호출 할 수 있습니다, 첫째로 온다. 그러나 귀하의 경우에는 self을 참조하기 때문에 그럴 수 없습니다.

이 경우 해결 방법은 암시 적 속성 풀어 선택적 항목 수 있도록하는 것입니다 :

var datasourceOnlineVideos:ASDataSource! 
var datasourceOfflineVideos:ASDataSource! 

선택적 항목을 초기화 할 필요가 없습니다 때문에 super.init 메서드가 호출 된 후, 당신은 안전하게를 초기화 할 수 있습니다. 암시 적으로 래핑되지 않으므로 다른 비 선택적 속성으로 사용합니다.

이 패턴은 Apple에서 여러 클래스로 사용합니다 (UIViewController 포함). IB의 콘센트를 추가하면 구성 요소 속성은 항상 암시 적으로 언 래핑 된 것으로 선언됩니다. 이는 컨트롤 자체가 초기화 프로그램에서 인스턴스화되지 않았으므로 나중에 사용되기 때문입니다.

+0

감사합니다. 이것은 나를 위해 일했습니다 :) 한 가지 더 :이 경우에는 데이터 소스 변수를 초기화하기 전에 super.init를 호출해야합니다. – iMemon

관련 문제