【问题标题】:How to modify SWIFT_MODULE_NAME?如何修改 SWIFT_MODULE_NAME?
【发布时间】:2016-08-05 08:03:20
【问题描述】:

标题说明了一切。我在构建设置中搜索了 SWIFT_MODULE_NAME,但什么也没找到。我也在网上搜索过,有对这个名字的引用,但是没有关于它是如何定义的信息。 此外,我在 Apple Docs 中找不到任何提及 SWIFT_MODULE_NAME 的内容。

我确实知道:它是在“Objective-C Generated Interface Header Name”构建设置中使用的,可以通过双击设置值来查看:

$(SWIFT_MODULE_NAME)-Swift.h

它用于弥合 Objective-C 和 Swift 之间的鸿沟,并且只出现在包含 Swift 文件的项目中(我认为还包括 Objective-C 文件)。截至本文发布时,Xcode 7.3 是最新最好的。

但是,这个值是在哪里定义的,我该如何修改呢?

【问题讨论】:

  • 您查看过此文档:developer.apple.com/library/ios/documentation/Swift/Conceptual/… 吗?通常是您的产品名称。您可以在 Build Settings 的“Product Bundle Identifier”中设置更改值。请注意,您不能在框架中覆盖产品名称
  • 是的,这很有帮助,谢谢。来自该文档:“Xcode 在为您的 Swift 代码命名 Objective-C 桥接头和生成的标头时使用您的产品模块名称 (PRODUCT_MODULE_NAME),而不是您的目标名称 (TARGET_NAME)。”

标签: ios objective-c xcode swift objective-c-swift-bridge


【解决方案1】:

模块名称来自产品模块名称构建设置:

SWIFT_MODULE_NAME 设置显然是隐藏的,但您可以通过查看 Xcode.app/Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.xcplugin/Contents/Resources/Swift.xcspec 来了解它的派生:

...
{
    Name = "SWIFT_MODULE_NAME";
    Type = String;
    DefaultValue = "$(PRODUCT_MODULE_NAME)";
    CommandLineArgs = (
        "-module-name",
        "$(value)",
    );
},
...

【讨论】:

  • 谢谢,就是这样!我更改了 PRODUCT_MODULE_NAME,并更新了 SWIFT_MODULE_NAME!
  • 哦,我的,4 小时寻找这个 - 辩论退休的概念。 Xcode 版本 9.4 (9F1027a) 从 3 天前创建的一个新的 swift 项目中将其填充为空白。我将发布一个可能的错误。哎哟!不要忘记 .m 中的 #import "MsbHrv-Swift.h",对于您访问的 swift 对象上的每个函数,将“@objc”放在 .swift 文件中的声明前面,并确保此 SWIFT_MODULE_NAME 是在 PRODUCT_MODULE_NAME 中设置。或者只是快速构建一切,快乐并抚摸小狗来平静你的一天。
  • 请注意,产品模块名称默认使用 $(PRODUCT_NAME:c99extidentifier),因此更改此设置的最佳位置是确保您将 PRODUCT_NAME 或“产品名称”设置为一个值,并且所有内容都会相应更新。跨度>
  • 跟进 Dino 的观察:还有一步,因为 PRODUCT_NAME 被定义为 $(TARGET_NAME)。但是......它在那里死胡同。我在任何设置中都找不到 TARGET_NAME;也许 Xcode 只在项目导航器(左窗格)中显示它。还有一件事:如果您的项目或产品名称带有连字符,Xcode 会将连字符替换为下划线。如果您在任何地方明确引用 $(SWIFT_MODULE_NAME)-Swift.h 文件的预期名称,这将导致构建失败。
【解决方案2】:

您是否查看过以下文档:developer.apple.com/library/ios/documentation/Swift/Conceptual/...?通常是您的产品名称。您可以在 Build Settings 中的“Product Bundle Identifier”中设置更改值。请注意,您不能在框架中覆盖产品名称

看截图:

【讨论】:

    【解决方案3】:

    转到构建设置并单击“级别”旁边的 +。 见:

    将 NEW_SETTING 替换为 SWIFT_MODULE_NAME 作为设置的名称,.h 文件的模块名称(请不要空格)放在右侧。

    【讨论】:

    • 点击加号以添加用户定义的设置是我最初错过的部分。
    • 添加了 SWIFT_MODULE_NAME 并修复了我在 XCode 9 上的单元测试,因为我们的模块名称中有一个“-”。谢谢。
    【解决方案4】:

    SWIFT_MODULE_NAME、PRODUCT_MODULE_NAME、PRODUCT_NAME、EXECUTABLE_NAME

    默认值:

    EXECUTABLE_NAME = $EXECUTABLE_PREFIX$PRODUCT_NAME$EXECUTABLE_SUFFIX
    SWIFT_OBJC_INTERFACE_HEADER_NAME = $(SWIFT_MODULE_NAME) 
    
    SWIFT_MODULE_NAME = $(PRODUCT_MODULE_NAME)
    PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier)
    PRODUCT_NAME = $(TARGET_NAME:c99extidentifier)
    

    观察:

    SWIFT_MODULE_NAME == PRODUCT_MODULE_NAME
    

    c99extidentifier

    Xcode 能够替换变量的值 c99extidentifier 标识符,支持来自 C99 的扩展字符

    //for example
    PRODUCT_NAME = My Framework
    PRODUCT_MODULE_NAME = $(PRODUCT_NAME:c99extidentifier) = My_Framework
    

    EXECUTABLE_NAME二进制名称

    Product Module Name(PRODUCT_MODULE_NAME) 确定import 语句的外观。例如,当您创建 LibraryFramework 时。

    使用:

    //Objective-C
    @import module_name; 
    
    //Swift
    import module_name 
    

    Product Name(PRODUCT_NAME) 确定二进制的名称。例如。 MyFramework.framework

    [TARGET_NAME]

    规则是:

    SWIFT_MODULE_NAME should equal to PRODUCT_MODULE_NAME
    

    [Custom .modulemap]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-19
      • 2012-01-24
      • 2014-10-20
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多