类不符合协议扩展的协议

时间:2017-09-12 21:51:17

标签: ios swift swift3 swift-protocols

我确实遇到与protocol extension, does not conform to protocol类似的问题,但那里的解决方案对我不起作用,我无法弄清楚原因。

我想创建一个带扩展名的协议来处理我的应用程序的登录行为。

首先,我不确定是否应该将带有扩展名的协议放在单独的文件中,或者只放在类声明上面的AppDelegate中。两种方式都不起作用。 AppDelegate知道协议,但它不知道扩展,所以它要我在类中实现handleLogin()

协定

protocol LoginFlowHandler {
    func handleLogin()
}

协议扩展

public extension LoginFlowHandler {

    func handleLogin(withWindow window: UIWindow?) {

        // Just for testing purpose
        let userIsLoggedIn = false

        if userIsLoggedIn == true {
            self.showMainApp(withWindow: window)
        } else {
            self.showLogin(withWindow: window)
        }

    }

    func showLogin(withWindow window: UIWindow?) {
        window?.subviews.forEach { $0.removeFromSuperview() }
        window?.rootViewController = nil
        window?.rootViewController = UIStoryboard(name: "Login", bundle: nil).instantiateInitialViewController()
        window?.makeKeyAndVisible()
    }

    func showMainApp(withWindow window: UIWindow?) {
        window?.rootViewController = nil
        window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        window?.makeKeyAndVisible()
    }
}

AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate, LoginFlowHandler {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        window = UIWindow.init(frame: UIScreen.main.bounds)

        handleLogin(withWindow: window)
        return true
    }
}

提前谢谢!

2 个答案:

答案 0 :(得分:1)

  

它希望我在类中实现handleLogin()。

是的,因为那是告诉它要做的事情。当你说

时,这意味着什么
protocol LoginFlowHandler {
    func handleLogin()
}

然后将您的类声明为LoginFlowHandler的采用者:

class AppDelegate: UIResponder, UIApplicationDelegate, LoginFlowHandler {

表示此类必须具有handleLogin()的实现。它没有。

如果您只是从协议中删除了该要求,那么您的代码编译正常:

protocol LoginFlowHandler {
    //func handleLogin()
}

目前还不清楚您认为自己是按照这个要求完成的,所以删除它并没有什么坏处。

或者,如果您因某种原因坚持要求,请按照以下方式编写:

protocol LoginFlowHandler {
    func handleLogin(withWindow:UIWindow?)
}

这样,你写的协议扩展就满足了这个要求。

答案 1 :(得分:1)

这是因为你的协议没有参数,它的实现有。

协定

handleLogin()

<强>实施

handleLogin(withWindow window: UIWindow?)

如果从扩展中删除参数或在协议中添加参数,它将起作用。