Ich habe eine Variable 'Kinder', die nur eine Liste von Teilnehmern ist. Kann man bitte erklären, wie ich eine Variable mit einem Typ zu einer Eigenschaft mit einem anderen Typ überschreiben kann.

Hier ist ein Code:

class ParticipantsListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var participantsTableView: UITableView!

    // Error on next line: Property 'children' with type '[Child]?' cannot override a property with type '[UIViewController]'
    var children: [Child]?
    var trackingHelper = TrackingHelper()
    var modelHelper = ModelHelper.shared
}
0
tory 18 Jän. 2019 im 00:18

3 Antworten

Beste Antwort

Das Problem ist sehr einfach. Das kannst du nicht machen. UIViewController, die Klasse, von der Sie erben, hat diese Eigenschaft unter Verschluss. Sie müssen sich eine neue Lösung erstellen, je nachdem, was Sie erreichen möchten:

Bedingung A: Child ist eine Unterklasse von UIViewController

In diesem Fall möchten Sie die untergeordneten Ansichtscontroller von ParticipantsListViewController immer an Child anpassen. Eine Möglichkeit, dies zu tun, wäre die folgende berechnete Eigenschaft:

var listChildren: [Child] {
    return children.filter { $0 is Child }
}

Bedingung B: Child ist KEINE Unterklasse von UIViewController

Sie versuchen, etwas zu überschreiben, das das System benötigen muss. Dinge im Array children müssen Instanzen oder Unterklassen von UIViewController sein. Es ist streng.

Ihre Lösung hier ist einfach. Benennen Sie die Eigenschaft anders und entfernen Sie die Überschreibung. Sicher, es wird nicht den schönsten und einfachsten Namen children haben, aber so geht es.

1
cook 17 Jän. 2019 im 21:32

Nein, Sie können keine children -Eigenschaft mit Ihrem benutzerdefinierten Typ haben, da die Eigenschaft mit dem gleichen Namen bereits die Eigenschaft von UIViewController ist (siehe docs) ist eine Oberklasse Ihres View Controllers, sodass Ihre Unterklasse auch diese Eigenschaft hat.

Sie müssen also einen anderen Namen für Ihre Variable verwenden.

1
Robert Dresler 17 Jän. 2019 im 21:40

Sie können dies mithilfe der Protokollkonformität für Ihre Child View-Controller erreichen, wie hier gezeigt:

import UIKit

protocol ChildProtocol { }

class SomeViewController: UIViewController, ChildProtocol { }

class ParticipantsListViewController: UIViewController {
    override var children: [UIViewController] {
        return self.children.filter { viewController in viewController is ChildProtocol }
    }
}

Solange die View-Controller, die Sie Child sein möchten, mit ChildProtocol übereinstimmen, werden sie über die untergeordnete Überschreibung zurückgegeben.

1
CodeBender 17 Jän. 2019 im 21:51