Ios Swift:在另一个目标内使用协议可以´;我找不到一些属性
我目前在ios应用程序中遇到了一个大问题 我们的项目结构如下所示:Ios Swift:在另一个目标内使用协议可以´;我找不到一些属性,ios,objective-c,swift,Ios,Objective C,Swift,我目前在ios应用程序中遇到了一个大问题 我们的项目结构如下所示: 1个SDK(第三方库),用Objective-C编写 1个“通用”框架,其中包含共享代码(总体而言,大多数代码都存在于此,与上面SDK相关的所有内容都存在于此) 不同的客户有不同的目标,它们只是为我们的“通用”框架定义自定义颜色和自定义图像 在通用框架内,我们添加了一个新的协议来包装所有SDK功能,它看起来有点像: 协议SDKRepositoryProtocol{ var oneClassFromSDK:SDKClass12
- 1个SDK(第三方库),用Objective-C编写
- 1个“通用”框架,其中包含共享代码(总体而言,大多数代码都存在于此,与上面SDK相关的所有内容都存在于此)
- 不同的客户有不同的目标,它们只是为我们的“通用”框架定义自定义颜色和自定义图像
协议SDKRepositoryProtocol{
var oneClassFromSDK:SDKClass123{get set}
[...]
var otherTestProp:SDKCustomDate{get set}
}
因此SDKClass123
和SDKCustomDate
是SDK中的私有类
使用SDKRepository类在我们的“通用”框架内运行良好,我们的大多数目标都成功构建,没有任何错误
现在,问题来了:
如果我们现在想在一个目标中使用SDKRepositoryProtocol
,IDE支持我们的使用,IntelliSense显示所有协议变量,但是如果我们想编译Swift文件,我们会遇到如下错误:
类型“SDKRepositoryProtocol”的值没有成员“oneClassFromSDK”
注:
- 这只发生在“发布”版本配置上&不在调试中
因此,接下来我们尝试在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()很好,但是当我们访问协议的属性时,它就不起作用了。