在Objective-C(或一般的C语言)中,如果我有两个文件,如
的main.m:
void foo();
int main (int argc, const char * argv[])
{
foo();
return 0;
}
foo.m:
void foo() {
// do something
}
我可以编译main.m到main.o,甚至没有foo.m,然后编译foo.m并链接到main.o:
$ clang -c main.m
# later
$ clang main.o foo.m -o FooExecutable
我的理解是,main.m第一行的前向声明或原型是使它工作的原因。
有没有办法在Swift中创建相同类型的设置?我还没有找到一种方法来进行相应的main.swift编译。
main.swift:
// How do I tell the compiler to trust me that foo() will be implemented?
foo()
foo.swift:
func foo() {
// do something
}
然后:
# This works:
$ swiftc main.swift foo.swift -o FooExecutable
# This doesn't:
$ swiftc -emit-object main.swift
main.swift:3:1: error: use of unresolved identifier 'foo'
foo()
^~~
答案 0 :(得分:2)
你不能在没有定义它的情况下在Swift中声明一个函数,即编译器 需要" foo.swift"为了编译" main.swift"。
以下是一个示例,说明如何单独编译Swift文件然后链接目标文件:
swift -frontend -c -module-name myprog -primary-file main.swift foo.swift swift -frontend -c -module-name myprog -primary-file foo.swift main.swift swiftc -o myprog main.o foo.o
这是一个非常简单的示例,适用于您可能需要导入的实际应用程序 其他框架并设置更多选项。检查waht是有益的 Xcode在构建项目时,完整的编译器和链接器输出 可以在报告导航器中找到。
另见SWIFT MAKEFILES – TAKE 2 对于基于GNU Make的一般解决方案。
另一种选择是针对a进行编译
.swiftmodule和一个共享库,比较例如How do I import a swift function declared in a compiled .swiftmodule into another swift file?。
然后func foo
必须标记为public
:
<强> foo.swift:强>
public func foo() {
print("foo")
}
swiftc -emit-module -emit-library -module-name Foo -module-link-name Foo foo.swift
创建Foo.swiftmodule和libFoo.dylib(这也可以在 单独的步骤)。现在main.swift可以导入Foo模块
<强> main.swift:强>
import Foo
foo()
swiftc -emit-object -I . main.swift
并且目标文件可以链接到共享库:
swiftc -o myprog -L . main.o