【问题标题】:Unexpected behaviour when extending a Swift protocol from another framework (Restofire)从另一个框架 (Restofire) 扩展 Swift 协议时的意外行为
【发布时间】:2016-04-28 08:48:44
【问题描述】:

我有两个框架

首先 - Restofire。它有一个带有扩展的协议 ResponseSerializer。

public protocol ResponseSerializable {

    /// The type of object returned in response.
    associatedtype Model

    /// The `Alamofire.ResponseSerializer`.
    var responseSerializer: ResponseSerializer<Model, NSError> { get }

}

extension ResponseSerializable {

    /// `CustomJSONResponseSerializer`
    public var responseSerializer: ResponseSerializer<Model, NSError> {
        return AlamofireUtils.JSONResponseSerializer()
    }

}

第二 - Restofire-Gloss。它对符合可解码的模型协议进行了扩展,该协议位于 Restofire 框架中。

public extension ResponseSerializable where Model: Decodable {

    /// `GLOSSResponseSerializer`
    public var responseSerializer: ResponseSerializer<Model, NSError> {
        return GlossUtils.GLOSSResponseSerializer()
    }

}

public extension ResponseSerializable where Model: CollectionType, Model.Generator.Element: Decodable {

    /// `GLOSSResponseSerializer`
    public var responseSerializer: ResponseSerializer<Model, NSError> {
        return GlossUtils.GLOSSResponseSerializer()
    }

}

当我将 Restofire-Gloss 的源文件直接导入项目时,一切都按预期工作,但是当我导入框架时,控件没有达到 Restofire-Gloss 框架中的功能。

【问题讨论】:

  • 我认为问题可能出在where clause。您确定您没有使用某些私有扩展来添加对协议的一致性吗?例如,如果有一个私有扩展使Model 符合Decodable,那么where 子句将不起作用。尝试公开所有扩展。
  • 一切都是公开的
  • 你是使用 pod 来添加框架,还是直接将框架拖放到你的项目中?
  • 我现在正在使用 Pod。

标签: ios swift swift2 swift-protocols


【解决方案1】:

也许您应该将扩展程序标记为公开?

【讨论】:

  • 协议扩展不允许使用诸如 public 或 private 的访问修饰符。这些扩展使用它们扩展的协议的访问级别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
相关资源
最近更新 更多