创建符合其他协议的协议var

时间:2017-02-28 16:39:51

标签: ios swift animation protocols

我有我的Swift项目,我想创建一个动画师。我将在我的所有视图控制器中使用此动画对象为每个视图控制器创建一个特定对象。实际的动画制作者对象必须符合except tf.errors.CancelledError协议。参见示例:

这是Animator协议:

Animator

这是一个真正的动画师对象:

protocol Animator {

    associatedtype ViewControllerGeneric
    var controller: ViewControllerGeneric { get }

    /// Init the animator
    ///
    /// - Parameter controller: The UIViewController to bind to the animator
    init(withController controller: ViewControllerGeneric)
}

这里一切都很好。然后,我希望我的所有class SolutionAnimator: Animator { private (set) var controller: SolutionsViewController required init(withController controller: SolutionsViewController) { self.controller = controller } } 子类都遵循我的其他协议UIViewController,即:

UIViewControllerAnimator

这里我想要一个名为protocol UIViewControllerAnimator { associatedtype AnimatorObject: Animator var animator: AnimatorObject { get set } } 的var,它是一个通用类型animator,必须符合AnimatorObject协议。

当我在MyViewController中编写所有内容时,如下所示:

Animator

Xcode告诉我class MyViewController: UIViewController, UIViewControllerAnimator { var animator: SolutionAnimator! } 不符合协议MyViewController

你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您的MyViewController不符合UIViewControllerAnimator。您的协议要求:

associatedtype AnimatorObject: Animator
var animator: AnimatorObject { get set }

你的班级提供:

var animator: SolutionAnimator!

SolutionAnimator!不符合AnimatorSolutionAnimator。删除!

如果您有某些技术原因导致无法删除!(例如,如果这是从故事板中实例化的,那可能是行不通的话),那么您只需要隐藏!这样你才能正确地遵守协议:

private var _animator: SolutionAnimator!
var animator: SolutionAnimator {
    get { return _animator }
    set { _animator = newValue }
}