Избыточное ограничение «Self»: ​​«AnyObject» - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть этот протокол:

protocol Container: class where Self: UIViewController {
    var containerView: UIView! { get }
    var currentChild: UIViewController? { get set }
    func remove(child viewController: UIViewController)
    func add(child viewController: UIViewController)
    func replaceCurrentViewController(with newChild: UIViewController)
}

проблема, с которой я сталкиваюсь, заключается в том, что он показывает следующее предупреждение

Избыточное ограничение 'Self': 'AnyObject'

это потому, что я использую оба class & , где Self: UIViewController , но мне нужны оба!причина в моем расширении протокола (см. ниже), я использую методы UIViewController, и если я удаляю class , мое расширение показывает ошибку, запрашивающую добавление mutating , что должноне имеют, потому что это протокол только для класса.

extension Container {
    func remove(child viewController: UIViewController) {
        viewController.beginAppearanceTransition(false, animated: true)
        viewController.willMove(toParent: nil)
        viewController.removeFromParent()
        viewController.view.removeFromSuperview()
        viewController.endAppearanceTransition()
        currentChild = nil
    }

    func add(child viewController: UIViewController) {
        viewController.beginAppearanceTransition(true, animated: true)
        addChild(viewController)
        viewController.didMove(toParent: self)
        containerView.addSubview(viewController.view)
        viewController.view.frame = containerView.frame
        viewController.endAppearanceTransition()
        currentChild = viewController
    }

    func replaceCurrentViewController(with newChild: UIViewController) {
        if viewIfLoaded != nil, let currentChild = currentChild {
            if let parent = currentChild.parent, parent == self {
                remove(child: currentChild)
            }
            add(child: newChild)
        }
    }
}

Итак, есть ли лучшее решение?можно удалить предупреждение?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

В Swift 4 вы можете использовать

protocol Container where Self: UIViewController {
    var containerView: UIView! { get }
    var currentChild: UIViewController? { get set }
    func remove(child viewController: UIViewController)
    func add(child viewController: UIViewController)
    func replaceCurrentViewController(with newChild: UIViewController)
}

В Swift 5 вы можете использовать

protocol Container: UIViewController {
    var containerView: UIView! { get }
    var currentChild: UIViewController? { get set }
    func remove(child viewController: UIViewController)
    func add(child viewController: UIViewController)
    func replaceCurrentViewController(with newChild: UIViewController)
}
0 голосов
/ 12 декабря 2018

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

protocol Container: class {
    var containerView: UIView! { get }
    var currentChild: UIViewController? { get set }
}

extension Container where Self: UIViewController {
    func remove(child viewController: UIViewController) {
        viewController.beginAppearanceTransition(false, animated: true)
        viewController.willMove(toParent: nil)
        viewController.removeFromParent()
        viewController.view.removeFromSuperview()
        viewController.endAppearanceTransition()
        currentChild = nil
    }

    func add(child viewController: UIViewController) {
        viewController.beginAppearanceTransition(true, animated: true)
        addChild(viewController)
        viewController.didMove(toParent: self)
        containerView.addSubview(viewController.view)
        viewController.view.frame = containerView.frame
        viewController.endAppearanceTransition()
        currentChild = viewController
    }

    func replaceCurrentViewController(with newChild: UIViewController) {
        if viewIfLoaded != nil, let currentChild = currentChild {
            if let parent = currentChild.parent, parent == self {
                remove(child: currentChild)
            }
            add(child: newChild)
        }
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...