从Swift应用程序调用Objective-C方法

从Swift应用程序调用Objective-C方法,objective-c,swift,xcode,macos,Objective C,Swift,Xcode,Macos,我正在制作一个Mac应用程序,完全用Swift。现在,我需要在应用程序中添加Objective-C函数,但我不知道如何添加。我对Objective-C知之甚少,但我需要将此pdf制作功能添加到我的应用程序中: void MyCreatePDFFile (CGRect pageRect, const char *filename)// 1 { CGContextRef pdfContext; CFStringRef path; CFURLRef url; CFDataRef boxData = N

我正在制作一个Mac应用程序,完全用Swift。现在,我需要在应用程序中添加Objective-C函数,但我不知道如何添加。我对Objective-C知之甚少,但我需要将此pdf制作功能添加到我的应用程序中:

void MyCreatePDFFile (CGRect pageRect, const char *filename)// 1
{
CGContextRef pdfContext;
CFStringRef path;
CFURLRef url;
CFDataRef boxData = NULL;
CFMutableDictionaryRef myDictionary = NULL;
CFMutableDictionaryRef pageDictionary = NULL;

path = CFStringCreateWithCString (NULL, filename, // 2
                            kCFStringEncodingUTF8);
url = CFURLCreateWithFileSystemPath (NULL, path, // 3
                 kCFURLPOSIXPathStyle, 0);
CFRelease (path);
myDictionary = CFDictionaryCreateMutable(NULL, 0,
                    &kCFTypeDictionaryKeyCallBacks,
                    &kCFTypeDictionaryValueCallBacks); // 4
CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));
CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));
pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary); // 5
CFRelease(myDictionary);
CFRelease(url);
pageDictionary = CFDictionaryCreateMutable(NULL, 0,
                    &kCFTypeDictionaryKeyCallBacks,
                    &kCFTypeDictionaryValueCallBacks); // 6
boxData = CFDataCreate(NULL,(const UInt8 *)&pageRect, sizeof (CGRect));
CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData);
CGPDFContextBeginPage (pdfContext, pageDictionary); // 7
myDrawContent (pdfContext);// 8
CGPDFContextEndPage (pdfContext);// 9
CGContextRelease (pdfContext);// 10
CFRelease(pageDictionary); // 11
CFRelease(boxData);
}
那代码是从

如何将该代码连接到Swift,如何从Swift视图控制器调用该代码


编辑:我正在使用Swift 3和Xcode 8 beta 5。

以下是iOS应用程序的解决方案:

文件内容。h:

在桥接标头中:

#import "Thing.h"

现在,您的Swift代码可以看到并调用此函数。

看到这个@OnurTuna我试过了,它似乎不起作用,因为这是用于将Objective-C对象与Swift结合使用,我认为这与方法不同,当我尝试将我的大函数放入“@implementation CustomObject”时,我无法从Swift文件中调用它,并且出现了一些错误,迫使我更改代码。简言之,它并没有真正起作用。@matt它来自苹果公司的MacPDF创建文档!此外,我的Mac应用程序代码的其他地方有CGRECT,没有错误。下面是一个示例Mac堆栈溢出问题,如果您需要更多证据,该问题具有CGRect:。但是谢谢你的回答,让我试试。实际上这是C,而不是Objective-C。你可以将代码放在.C文件中,将函数原型放在.h文件中,并从桥接头中包含.h文件,就像包含Objective-C代码一样但是你对myDrawContent pdfContext有什么期待;怎么办?这个函数应该从哪里来?@MartinR我会假设myDrawContent是Quartz的一部分,我也在H文件中导入它。但我想我不知道!文档中并不是很清楚。我想做的是:macOS上有带CGRect、CGContextRef的CoreGraphics和所有这些东西。@MartinR谢谢:D。还有matt,我遇到了一个奇怪的错误。所有这些:架构x86的未定义符号\u 64:\u myDrawContent,引用自:_myCreatePffilein CreatePDF.o ld:未找到架构x86的符号\u 64 clang:错误:链接器命令失败,退出代码为1使用-v查看invocationMatt,此处的代码完全有效,因此我接受它作为正确答案,尽管我的整个问题并没有真正解决,因为我的代码做得不好,但没有必要为了调用C函数而定义Objective-C类。
#import "Thing.h"

@implementation Thing

void MyCreatePDFFile (CGRect pageRect, const char *filename) {
    // ... your code here ...
}

@end
#import "Thing.h"