框架中的Swift扩展

hag*_*ile 6 swift

我正在学习Swift的扩展并遇到一个有点奇怪的问题.

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

确切地说,我创建了一个非常简单的快速文件,包括这些代码行 -

import Foundation
extension NSDate {
    func blah() -> Int {
        return 0
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我正在使用Xcode beta 3.

小智 3

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

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

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

嵌入式框架屏幕截图 1

  • 运行路径搜索路径:

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

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

2. 创建捆绑包并更改构建设置

为其指定与命令行工具相同的名称,但后缀为Bundle(例如 CommandLineToolProductNameBundle)。还要确保它的目标与命令行工具位于同一项目中。

嵌入式框架屏幕截图 3

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

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

嵌入式框架屏幕截图 2

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

3. 在构建阶段添加依赖

嵌入式框架屏幕截图 5

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

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

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

4. 更改Runbundle方案中的配置

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

嵌入式框架屏幕截图 4

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

  • 调试可执行文件:YES