Переопределение свойства переменной с другим типом - PullRequest
0 голосов
/ 18 января 2019

У меня есть переменная 'children', которая является просто списком участников. Можно ли объяснить, как я могу переопределить переменную одного типа для свойства другого типа.

Вот код:

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
}

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Проблема очень проста.Вы не можете сделать это.UIViewController, класс, от которого вы наследуете, имеет это свойство под замком и ключом.Вам нужно будет создать себе новое решение в зависимости от того, чего вы пытаетесь достичь:

Условие A: Child является подклассом UIViewController

В этом случае вынужен способ заставить дочерние контроллеры вида ParticipantsListViewController всегда соответствовать Child.Одним из способов сделать это было бы следующее вычисляемое свойство:

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

Условие B: Child НЕ является подклассом UIViewController

Вы пытаетесь переопределить то, чтоСистема должна быть там.Вещи в массиве children должны быть экземплярами или подклассами UIViewController.Это строго.

Ваше решение здесь легко.Назовите свойство по-другому и избавьтесь от переопределения.Конечно, у него не будет самого красивого и простого имени children, но так оно и есть.

0 голосов
/ 18 января 2019

Вы можете сделать это, используя соответствие протокола для ваших Child контроллеров представления, как показано здесь:

import UIKit

protocol ChildProtocol { }

class SomeViewController: UIViewController, ChildProtocol { }

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

До тех пор, пока контроллеры представления, которыми вы хотите быть Child, соответствуют ChildProtocol, они будут возвращены через дочернее переопределение.

0 голосов
/ 18 января 2019

Нет, вы не можете иметь children свойство с вашим пользовательским типом, поскольку свойство с с таким же именем уже является свойством UIViewController (см. docs ), которое является суперклассомвашего контроллера представления, так что ваш подкласс также имеет это свойство.

Итак, вы должны использовать другое имя для вашей переменной.

...