2016-02-07 10 views
8

Mam problem, gdy buduję moją aplikację w szybkim 2. Xcode mówi:Swift: Błąd: 'wymagana' inicjator 'init (koder :)' muszą być dostarczone przez podklasy 'UIView'

'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'

jest to kod klasy:

class creerQuestionnaire: UIView { 
    @IBOutlet weak var nomQuestionnaire: UITextField! 
    @IBOutlet weak var question: UITextField! 
    @IBOutlet weak var reponse: UITextField! 
    var QR: Questionnaire 

    @IBAction func creerQuestion(sender: AnyObject) { 
    QR.ajouterQuestion(question.text!, nouvReponse: reponse.text!) 
    } 
} 

i jest to klasa Kwestionariusz:

import Foundation 

class Questionnaire { 
    var QR = [String(), String()] 

    func getQuestion(nbQuestion: Int) ->String { 
    return QR[nbQuestion] 
    } 

    func getReponse(nbReponse: Int) ->String { 
    return QR[nbReponse] 
    } 

    func ajouterQuestion(nouvQuestion: String, nouvReponse: String) { 
    QR += [nouvQuestion, nouvReponse] 
    } 
} 

Merci!

Odpowiedz

8

Uwaga dla wymagana: Zapisz wymagany modyfikator przed definicją inicjalizatora klasy, aby wskazać, że każda podklasa klasy musi implementować inicjalizator.

Uwaga dla ręcznym: Zawsze napisać modyfikator override gdy nadrzędne superklasy wyznaczony inicjator, nawet jeśli realizacja podklasie jest od inicjatora jest inicjator wygoda.

Nad obu notatki są dalej od: Swift Programming Language/Initialization

Dlatego twoja podklasa UIView powinien wyglądać podobnie do poniższej próbce:

zmienne
class MyView: UIView { 
    ... 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
    ... 
} 
+0

dlaczego jest jednym 'override' i inne "wymagane"? –

+0

@MichaelDautermann Właśnie dodałem trochę informacji o wymaganych i nadpisaniach. Dzięki za atrakcję. – Allen

+0

Dzięki za odpowiedź! –

-1

dla opcjonalne muszą być zainicjowane z wartością ...

Albo stwierdzenie QR jako opcjonalny

var QR: Questionnaire? 

LUB zainicjować go:

var QR: Questionnaire = Questionnaire() 
1

kilka uwag do tego kodu:

var QR = [String(), String()] 

nazwę var powinien zaczynać się od małej litery: var QR

Czy chcesz zainicjować z 2 pustych strun? W twoim kodzie otrzymujesz ["", ""] w init. Ta tablica nie będzie bardzo wygodna w użyciu, ponieważ połączysz pytanie i odpowiedź po kolei.

będzie prawdopodobnie lepiej utworzyć tablicę par:

var qr : [(q: String, r: String) = [] // initiated as empty 

dostęp do jego elementów przez: QR [i] poradnik i QR [i] .r

trzeba przetestować że nbQuestion jest w granicach; z poprzedniej definicji QR, który byłby

func getQuestion(nbQuestion: Int) ->String { 
    if nbQuestion < 0 || nbQuestion >= qr.count { return "" } 
    return qr[nbQuestion].q 
} 

Uwaga: nbReponse i nbQuestion dzielić tę samą wartość dla danego QR

func getReponse(nbReponse: Int) ->String { 
    if nbReponse < 0 || nbReponse >= qr.count { return "" } 
     return qr[nbReponse].r 
} 

func ajouterQuestion(nouvQuestion: String, nouvReponse: String) { 
    qr += [(nouvQuestion, nouvReponse)] 
} 
0

According to the latest swift syntax, the init method needs to add methods:

required init?(coder aDecoder: NSCoder) 
{ 

    fatalError("init(coder:) has not been implemented") 
} 
Powiązane problemy