协议内部的 Swift 协议

Kev*_*ers 2 swift swift-protocols

我遇到了 Swift 协议的问题。我有这样的事情:

\n\n
protocol OnboardingPage {\n  var viewModel: OnboardingPageViewModel! { get }\n}\n\nprotocol OnboardingPageViewModel {\n  func getValue() -> Bool\n}\n\n// ---\n\nclass FirstNameViewController: UIViewController, OnboardingPage {\n  var viewModel: FirstNameViewModel!\n}\n\nclass FirstNameViewModel: OnboardingPageViewModel {\n  func getValue() -> Bool {\n    return true\n  }\n}\n\nclass GenderViewController: UIViewController, OnboardingPage {\n  var viewModel: GenderViewModel!\n}\n\nclass GenderViewModel: OnboardingPageViewModel {\n  func getValue() -> Bool {\n    return false\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有一堆确认协议的视图控制器OnboardingPage,它们都有一个符合协议的视图模型OnboardingPageViewModel协议的视图模型。

\n\n

但遗憾的是上面的代码不起作用:它说不FirstNameViewController确认OnboardingPage协议,因为它的viewModel属性具有类型FirstNameViewModel而不是OnboardingPageViewModel- 即使FirstNameViewModelOnboardingPageViewModel.

\n\n

我该如何解决这个问题?

\n

Cru*_*ruz 5

使用关联类型OnboardingPageViewModel 类型 ViewModel

已编辑

protocol OnboardingPage {
    associatedtype ViewModel: OnboardingPageViewModel

    var viewModel: ViewModel { get }
}

protocol OnboardingPageViewModel {
    func getValue() -> Bool
}

class FirstNameViewController: OnboardingPage {
    let viewModel: FirstNameViewModel

    init(viewModel: FirstNameViewModel) {
        self.viewModel = viewModel
    }
}

class FirstNameViewModel: OnboardingPageViewModel {
    func getValue() -> Bool {
        return true
    }
}

class GenderViewController: OnboardingPage {
    let viewModel: GenderViewModel

    init(viewModel: GenderViewModel) {
        self.viewModel = viewModel
    }
}

class GenderViewModel: OnboardingPageViewModel {
    func getValue() -> Bool {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)