我的Swift / Obj-C混合项目设置了两个目标:
public class Blah {
public Yadda1 Yadda1 { get; set; }
public Yadda2 Yadda2 { get; set; }
public Yadda3 Yadda3 { get; set; }
[XmlElement("contentX", typeof(ContentX))]
[XmlElement("contentY", typeof(ContentY))]
[XmlChoiceIdentifier(nameof(PayloadType))]
public Payload Payload { get; set; }
public PayloadType PayloadType { get; set; }
}
public abstract class Payload { ... }
public class ContentX : Payload { ... }
public class ContentY : Payload { ... }
[XmlType]
public enum PayloadType
{
[XmlEnum("contentX")]
ContentX,
[XmlEnum("contentY")]
ContentY,
}
和MyProject
为了编写单元测试(使用MyProjectTests
),我对主要目标(XCTest
)构建设置进行了以下配置:
MyProject
这很好,但是我想知道当我指定Enable testability = Yes
Defines module = Yes
时实际发生了什么。这是否意味着为项目创建了一个框架,或者至少为该项目创建了一个模块映射,还是一个伞形标题?还是Xcode将主要项目目标与其他框架(例如CocoaPods创建的框架)区别对待?如果是第一种情况,即至少生成了临时构建文件以使主目标看起来像一个模块,那么它们通常位于何处?在Defines module = Yes
中?
答案 0 :(得分:2)
使应用程序与Swift和Objective-C一起使用可能是一个微妙的过程。如果要混合项目,则必须采用模块。将旧的Objective-C代码引入Swift项目时,这意味着在框架目标中将“定义模块”(DEFINES_MODULE
)构建设置设置为YES
。这指示Xcode在框架的标题旁边安装module.modulemap
文件(可能还有module.private.modulemap
)。 Objective-C框架需要定义一个要由Swift使用的模块。