协议扩展,不符合协议要求。

7

我正在创建一个名为MyFramework的框架,其中包含LoginProtocol.swift,它具有一些默认行为。

import UIKit

public protocol LoginProtocol {
    func appBannerImage() -> UIImage?
    func appLogoImage() -> UIImage?
}


extension LoginProtocol {
    func appBannerImage() -> UIImage? {
        return (UIImage(named: "login_new_top")) 
    }

    func appLogoImage() -> UIImage? {
        return (UIImage(named: "appLogo"))

    }
}

接下来,我将添加一个新的目标,创建一个名为MyDemoApp的演示应用程序,该应用程序使用MyFramework:

import UIKit
import MyFramework

class LoginViewContainer: UIViewController, LoginProtocol {    
    // I think I am fine with defaults method. But actually getting an error
}

目前,我从编译器中得到了一个错误,比如:

type 'LoginViewContainer does not conform protocol 'LoginProtocol'

我不确定为什么会收到这个消息,因为使用协议扩展时,类不需要遵循协议。如果您能就此问题提供一些建议,那将非常好。谢谢。
PS: 这里是代码的链接,随意查看。

4
您的扩展程序并不是公开的。 - Hamish
@originaluser2:很好的发现。感谢你的回答。你为我节省了几个小时。 - tonytran
不是技术上的答案,很高兴能够帮忙,现在可以自由删除这个问题 - 除非你觉得这对其他人有用,在这种情况下我可以写一个真正的答案。重要的是这个问题不会在外部世界看来是“未解决”的。 - Hamish
我现在正在学习Swift,如果您能写出一个实际的答案,那将非常好,这样其他成员(像我一样)就可以知道发生了什么。 - tonytran
1个回答

10
问题在于你的扩展(extension)不是公开的 - 因此它在定义它的模块 (这里是MyFramework) 之外不可见。
这意味着你的视图控制器只知道LoginProtocol的定义(因为它是公开的),但不知道默认实现。因此,编译器会抱怨协议方法未被实现。
解决方案很简单,只需要将扩展(extension)设为public即可。
public extension LoginProtocol {
    func appBannerImage() -> UIImage? {
        return (UIImage(named: "login_new_top")) 
    }

    func appLogoImage() -> UIImage? {
        return (UIImage(named: "appLogo"))

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接