迅速:在另一个目标中使用协议找不到某些属性

时间:2019-10-08 07:29:12

标签: ios objective-c swift

我的ios应用程序当前存在一个大问题。

我们的项目结构如下:

  • 1个SDK(第3方库),以 Objective-C
  • 编写
  • 1个“通用”框架,其中包含共享代码(所有大多数代码都存储在此处以及与SDK相关的所有内容)
  • 针对不同客户的不同目标,它们只是为“通用”框架定义自定义颜色和自定义图像。

在Common框架内,我们添加了一个新协议来包装所有SDK功能,看起来就像这样:

protocol SDKRepositoryProtocol {

var oneClassFromSDK : SDKClass123 { get set }
[...]
var otherTestProp: SDKCustomDate { get set } 

}

因此SDKClass123SDKCustomDate是SDK中的私有类。

在我们的“通用”框架中使用SDKRepository类可以正常工作,并且大多数目标都已成功构建,没有任何错误。

现在,问题出在这里:

如果我们现在想在一个目标中使用SDKRepositoryProtocol,则IDE支持我们的用法,并且IntelliSense会显示所有协议变量,但是如果我们要编译 Swift >文件,我们会收到如下错误:

Value of type 'SDKRepositoryProtocol' has no member 'oneClassFromSDK'

注意:

  • 这仅在“发布”版本配置中发生,而在DEBUG中不存在

如果我们尝试访问repoProtocol.otherTestProp在两个构建配置中均有效,则更为神秘。


因此,接下来,我们尝试在TargetAppDelegate中将相同的协议用于相同的目标(仍然使用Obj-C编写)。 使用属性repoProtocol.oneClassFromSDK

也没有问题

那么,如果我们仅为TargetAppDelegate创建一个新扩展(使用Swift),还会有其他问题吗?我们需要定义某物吗?更多?


所以,对我来说,似乎是:

a)用于发行版本的编译器引起问题并删除了他认为未使用的属性(“ oneClassFromSDK”)

b)整个SDK不会导入到目标中,因为oneClassFromSDK不能在Swift中使用,但是otherTestProp编译不会出现问题

c)希望您有一些好主意


摘要

  • 我们在通用框架内有一个协议
  • 在目标的
  • 内部AppDelegate( ObjC )中,我们可以访问所有属性(调试和发布版本)
  • 在AppDelegate的Swift Extension中,我们没有访问某些属性(并非全部),并且仅在 Release Build
  • 中访问

我们尝试过的事情:

  • 一些常规内容:清理构建/清理派生文件夹/在另一台PC上不工作
  • 我们已经尝试在调试/发布配置中查找差异
    • 我们没有找到任何
    • 我们还尝试从其他目标(可以使用该协议的地方)“强行”配置
  • 我们检查了文件是否包含两次,所以有两种不匹配的协议,但是在我们的项目文件中,它只有一次
    • 我们还尝试切换目标成员身份,因为过去这有助于重置项目配置文件中的问题

编辑:

因此,我们可以将问题最小化为一个文件:

class MyCustomServiceInTarget: NSObject {
    let shello: SDKClass123
    let repo: SDKRepositoryProtocol

    init(repoProtocol: SDKRepositoryProtocol) {
        self.repo = repoProtocol

        var x = repoProtocol.oneClassFromSDK // Will produce an error 
    }

因此,在此服务内,我们收到类似上面的错误。该服务是在Targets AppDelegate内部使用的,因此它最初也显示在此处。

现在,想象一下: 如果我们在行let shello: SDKClass123上注释掉并尝试再次使用repo.shell属性,它就可以正常工作! :O:O

有人可以解释吗?

0 个答案:

没有答案