В целевом приложении мостовой заголовок делает трюк. Внутри рамочной цели все сложнее. Внутри кода Swift мы можем импортировать только так называемые модули. Фокус в том, чтобы определить карту модуля, которая предоставляет нужный ресурс библиотеки C и сделать его видимым, установив SWIFT_INCLUDE_PATHS внутри параметров сборки (Build Settings-> Swift Compiler-> Import Paths) на путь файла карты модуля. Для этого есть два способа:
1) Ниже приведена возможность реализации чистой быстрой реализации путем непосредственного воздействия на интерфейс ifadds.s.htm, но, к сожалению, требуется точный путь к файлу заголовка, что нежелательно, если вы когда-либо собирается выпустить вашу библиотеку как открытый источник.
module.modulemap
module ifaddrs [system] {
header
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/ifaddrs.h"
export *
}
Добавить в стремительный код
import ifaddrs
2) Второй способ заключается в создании класса Objective-C, который обеспечивает интерфейс для ifaddrs.h но скрывает фактический импорт ifaddrs.h исходного файла * .m.
NetworkTools.h
@interface NetworkTools : NSObject
+ (NSDictionary *)getIFAddresses;
@end
NetworkTools.m
#import "NetworkTools.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <netdb.h>
@implementation NetworkTools
+ (NSDictionary *)getIFAddresses {
NSDictionary *addresses;
// code
return addresses;
}
module.modulemap
module NetworkTools {
header "Obj-C Tools/NetworkTools.h"
export *
}
Добавить в стремительный код
import NetworkTools
Для получения дополнительной информации о том, как все это работает вместе, проверьте:
Пример проекта на Github: https://github.com/danieleggert/mixed-swift-objc-framework
Как также статью о модулях лязга: http://clang.llvm.org/docs/Modules.html
Мне нужно, чтобы он работал как на iOS, так и на OS X, так как NSHost доступен только в OS X, я не могу его использовать. – Asyra
Возможно, вы захотите добавить это к своему вопросу. – zneak