【问题标题】:Candidate has non-matching type of 'clearly matching type'候选人具有“明显匹配类型”的非匹配类型
【发布时间】:2020-07-20 15:20:09
【问题描述】:

所以这是交易:

extension APIManager: LoginAPIManagerProtocol, LoginProtocol {}

protocol LoginAPIManagerProtocol { var user: User? { get } }

class APIManager {
...
var user: User?
...
}

所有这些都在不同的文件中。 LoginAPIManagerProtocol 在不同的模块中。 APIManager 和扩展在同一个模块中。

使用 Swift 5,ios 13 分钟 SDK。

我想要的是通过定义的协议将用户变量(已经在旧的遗留应用程序中定义和使用)公开给新的消费者(和要模拟的测试)。

但是!:

all I get is this

那么..我现在该怎么办?尝试隔离问题。同样的错误。

【问题讨论】:

标签: ios compiler-errors architecture protocols


【解决方案1】:

我得到的答案:

我不确定为什么不能按原样公开变量。 User 不是协议;它只是NSManagedObject 的子类。

我测试了在课堂上公开一个简单的bool,效果很好。

但最终暴露整个 User 对象并不是很明智,因为我可能需要在依赖模块中提取它的所有依赖项,即使模块本身并不使用它们。

所以我:

  • 声明了一个协议(在依赖模块中),用于从User 公开我需要的内容
public protocol ModuleUser {
  var id: Int64
}
  • 在依赖协议中使用:
public protocol LoginAPIManagerProtocol {
...
var moduleUser: ModuleUser? { get }
...
}
  • 和一致性:
extension APIManager: LoginAPIManagerProtocol, LoginProtocol {
    var moduleUser: ModuleUser? {
        return self.user
    }
}

现在我不再需要将User 对象添加到依赖模块了;这是noice:D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多