Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:在另一个目标内使用协议可以´;我找不到一些属性_Ios_Objective C_Swift - Fatal编程技术网

Ios Swift:在另一个目标内使用协议可以´;我找不到一些属性

Ios Swift:在另一个目标内使用协议可以´;我找不到一些属性,ios,objective-c,swift,Ios,Objective C,Swift,我目前在ios应用程序中遇到了一个大问题 我们的项目结构如下所示: 1个SDK(第三方库),用Objective-C编写 1个“通用”框架,其中包含共享代码(总体而言,大多数代码都存在于此,与上面SDK相关的所有内容都存在于此) 不同的客户有不同的目标,它们只是为我们的“通用”框架定义自定义颜色和自定义图像 在通用框架内,我们添加了一个新的协议来包装所有SDK功能,它看起来有点像: 协议SDKRepositoryProtocol{ var oneClassFromSDK:SDKClass12

我目前在ios应用程序中遇到了一个大问题

我们的项目结构如下所示:

  • 1个SDK(第三方库),用Objective-C编写
  • 1个“通用”框架,其中包含共享代码(总体而言,大多数代码都存在于此,与上面SDK相关的所有内容都存在于此)
  • 不同的客户有不同的目标,它们只是为我们的“通用”框架定义自定义颜色和自定义图像
在通用框架内,我们添加了一个新的协议来包装所有SDK功能,它看起来有点像:

协议SDKRepositoryProtocol{
var oneClassFromSDK:SDKClass123{get set}
[...]
var otherTestProp:SDKCustomDate{get set}
}
因此
SDKClass123
SDKCustomDate
是SDK中的私有类

使用SDKRepository类在我们的“通用”框架内运行良好,我们的大多数目标都成功构建,没有任何错误

现在,问题来了:

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

类型“SDKRepositoryProtocol”的值没有成员“oneClassFromSDK”

注:

  • 这只发生在“发布”版本配置上&不在调试中
如果我们试图访问repoProtocol.otherTestProp,那么更神秘的是,它在两种构建配置中都能工作


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

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


因此,对我来说,这似乎是:

a) 发布版本的编译器正在引发问题并删除他认为未使用的属性(“oneClassFromSDK”)

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

c) 希望你有一些好主意


摘要

  • 我们在公共框架内有一个协议
  • 在目标的AppDelegate(ObjC)中,我们可以访问所有属性(调试和发布版本)
  • 在AppDelegate的Swift扩展中,我们对某些属性(不是全部)有访问权限,并且仅在发布版本中
我们尝试过的事情:

  • 一些常规的东西:干净的构建/干净的派生文件夹/不在另一台电脑上工作
  • 我们已经尝试在调试/发布配置中找到差异
    • 我们没有找到
    • 我们还试图从另一个目标(我们可以使用协议的地方)对配置进行“暴力”处理
  • 我们检查了文件是否包含两次,因此有两个不匹配的协议,但在项目文件中只包含一次
    • 我们还尝试切换目标成员身份,因为这在过去有助于重置项目配置文件中的问题

编辑:

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

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

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

        var x = repoProtocol.oneClassFromSDK // Will produce an error 
    }
因此,在这个服务中,我们得到了如上所述的错误。该服务在目标AppDelegate中使用,因此它最初也出现在那里

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


有人能解释一下吗?

只是为了确保:公共框架中的所有内容都声明为
public
open
,对吗?@yona是的,没错。但是如果
SDKClass123
SDKCustomDate
都是私有类,您希望如何在框架之外使用它们?私有框架也会导入到主应用程序中。我们可以让myClass=SDKClass123()很好,但是当我们访问协议的属性时,它就不起作用了。