Есть ли способ вызвать подпрограммы C из Swift?
Многие библиотеки iOS / Apple предназначены только для C, и я все еще хотел бы иметь возможность вызывать их.
Например, я хотел бы иметь возможность вызывать библиотеки времени выполнения objc из swift.
В частности, как вы соединяете заголовки iOS C?
Компилятор преобразует C API в Swift так же, как и в Objective-C.
См. Взаимодействие с Objective C API в документации.
источник
CFTypeRef
) в стиле CoreFoundation преобразуются в объекты Swift. Однако большинство функций ObjCRuntime.h не имеют смысла для Swift.На всякий случай, если вы новичок в XCode, как и я, и хотите попробовать фрагменты, опубликованные в ответе Леандро :
источник
В этом посте также есть хорошее объяснение того, как это сделать, используя поддержку модуля clang .
Он создан с точки зрения того, как это сделать для проекта CommonCrypto, но в целом он должен работать для любой другой библиотеки C, которую вы хотите использовать из Swift.
Я кратко экспериментировал с этим для zlib. Я создал новый проект iOS Framework и создал каталог zlib, содержащий файл module.modulemap со следующим:
Затем в Targets -> Link Binary With Libraries я выбрал add items и добавил libz.tbd.
Вы можете построить на этом этапе.
Затем я смог написать следующий код:
Вам не нужно помещать имя библиотеки zlib впереди, за исключением того, что в приведенном выше случае я назвал функцию класса Swift такой же, как и функцию C, и без квалификации функция Swift будет вызываться повторно, пока приложение не остановится.
источник
В случае с ++ появляется эта ошибка:
Вам также нужен заголовочный файл c ++. Добавьте c-linkage к вашей функции, затем включите файл заголовка в заголовок моста:
Свифт 3
UserInput.h
UserInput.c
main.swift
cliinput-Bridging-header.h
Вот оригинальное видео, объясняющее это
источник
__OBJC
проверку к своему Bridging-Header, например#ifdef __OBJC @import UIKit; #endif
Похоже, что при работе с указателями это совсем другой шар. Вот что у меня есть для вызова
read
системного вызова C POSIX :источник