【问题标题】:Swift Extension in a Framework框架中的 Swift 扩展
【发布时间】:2014-07-08 23:00:39
【问题描述】:

我正在学习 Swift 的扩展,遇到了一个有点奇怪的问题。

当我在 String 上编写扩展并将其编译到框架中时,我能够将框架导入不同的项目并使用字符串扩展而没有任何问题。但是,当我在 NSDate 上编写扩展并尝试在不同的项目中使用它时,编译器报告“NSDate 没有名为...的成员”

确切地说,我创建了一个非常简单的 swift 文件,其中包含这些代码行——

import Foundation
extension NSDate {
    func blah() -> Int {
        return 0
    }
}

然后我创建了一个目标(Cocoa 框架)并将这个文件添加到编译列表中。框架编译成功。

然后我创建了一个命令行工具并导入了这个项目,同时链接到框架。当我在 NSDate 上调用函数 blah() 时,编译器抱怨。

我正在使用 Xcode beta 3。

【问题讨论】:

标签: swift


【解决方案1】:

(如http://colemancda.github.io/programming/2015/02/12/embedded-swift-frameworks-osx-command-line-tools/ 中所述)

1。创建一个 Objective-C 命令行工具并更改搜索路径

不是斯威夫特。您可以为您放入命令行工具的代码创建一个 Swift 框架,但该工具本身不能编译任何 Swift 代码。这样做会混淆链接器并使其看到 Swift 库的重复声明(一个在随附的 .dylib 中,另一个嵌入在命令行工具中)。

  • 运行路径搜索路径:

调试:$(inherited) @executable_path/../Frameworks @executable_path/$(PRODUCT_NAME).bundle/Contents/Frameworks

发布:$(inherited) @executable_path/../Frameworks

2。创建一个包并更改构建设置

将其命名为与您的命令行工具相同的名称,但后缀为 Bundle(例如 CommandLineToolProductNameBundle)。还要确保它与你的命令行工具在同一个项目中的目标。

  • 目标名称:命令行工具产品名称 + Bundle

  • 产品名称:与命令行工具产品名称相同

  • 嵌入内容包含 Swift 代码:YES

3。在构建阶段添加依赖项

  • 目标依赖项:您的命令行工具

  • 创建一个新的Copy files 阶段,将Destination 设置为Executables 并将您的命令行工具添加到要复制的文件列表中。

  • 创建一个新的Copy files 阶段,将Destination 设置为Frameworks,并将您的嵌入式框架添加到要复制的文件列表中。

4。更改捆绑包方案中的Run 配置

您还可以选择隐藏命令行工具的方案,因为它不能独立运行。

  • 可执行文件:您的命令行工具

  • 调试可执行文件:YES

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多