协议扩展,不符合协议

Posted

技术标签:

【中文标题】协议扩展,不符合协议【英文标题】:protocol extension, does not conform to protocol 【发布时间】:2016-06-05 18:49:24 【问题描述】:

我正在创建一个名为 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:this 是这些代码的链接。随意看看。

【问题讨论】:

你的扩展不是公开的 @originaluser2:很好。感谢您的回答。你节省了我的时间。 从技术上讲不是一个答案;)很乐意提供帮助,请随时删除该问题 - 除非您认为它对其他人有用,在这种情况下我可以写一个实际的回答。重要的是,这个问题在外界看来并非“未解决”。 我现在正在学习 Swift,如果你能写一个实际的答案,这样其他成员(比如我)可以知道发生了什么,那就太好了。 【参考方案1】:

问题是你的extension 不是公开的——因此它在它定义的模块之外是不可见的,在这种情况下是MyFramework

这意味着您的视图控制器只知道LoginProtocol 定义(因为这个公开的),而不是默认实现。因此编译器会抱怨协议方法没有被实现。

因此,解决方案是简单地将扩展公开:

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

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

    

【讨论】:

以上是关于协议扩展,不符合协议的主要内容,如果未能解决你的问题,请参考以下文章

扩展符合 NSFetchRequestResult 的协议

仅在符合特定协议时才对类进行 Swift 扩展

swift 学习- 25 -- 协议 02

Swift 泛型和协议扩展

通过框架之间的扩展实现 Swift 协议一致性

UITableView 不符合协议