Swift函数前向声明或原型

时间:2017-06-13 20:08:52

标签: swift compilation

在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()
^~~

1 个答案:

答案 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