我确实遇到与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
}
}
提前谢谢!
答案 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?)
如果从扩展中删除参数或在协议中添加参数,它将起作用。