Bonjour à tous. Il s'agit de hiroakit du développeur d'applications iOS / tvOS.
Dans cet article, je vais vous montrer comment utiliser une bibliothèque écrite en C ou C ++ avec Swift.
L'environnement de développement utilisé au moment de la rédaction de cet article est le suivant.
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.12.6
BuildVersion: 16G1114
$ xcrun -find xcode build
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild
$ xcodebuild -version
Xcode 9.2
Build version 9C40b
$ xcrun -find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
$ clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Vous pouvez utiliser la bibliothèque C (par exemple, OpenJPEG) comme framework Swift.
Dans cet article, je voudrais continuer avec la bibliothèque C suivante pour l'explication.
- libExample.a
- include/Example.h
- include/ExampleEncoder.h
Supposons qu'une application écrite en Swift veuille importer et utiliser cette bibliothèque dans un framework.
import UIKit
import Example
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
ExampleEncoder.run(urlString: "https://www.example.com/", profile: "path/to/profile")
}
}
Dans ce cas, lorsque vous encapsulez la bibliothèque C avec Swift dans un framework, vous devez préparer un fichier .modulemap
comme indiqué ci-dessous.
framework module Example {
umbrella header "Example.h"
export *
module * { export * }
header "ExampleEncoder.h"
}
Après avoir ajouté ce Example.framework du côté de l'application, vous devez définir le chemin de ce framework vers les éléments de configuration suivants du projet Xcode.
.modulemap
?Le fichier .modulemap
est nécessaire pour transmettre le fichier d'en-tête utilisé par la bibliothèque C à Swift via Clang Modules.
Ce qui suit montre le format du fichier .modulemap
. Décrivez à l'aide du module map language.
[explicitopt] [frameworkopt] module module-id attributesopt {
/* module-member */
}
Notez que le langage de la carte du module n'est pas garanti de fonctionner entre les versions principales de Clang. Par conséquent, si la version principale de Clang incluse dans Xcode change, il est nécessaire de vérifier si le comportement ici est celui prévu par le développeur.
The module map language is not currently guaranteed to be stable between major revisions of Clang.
J'ai présenté comment utiliser la bibliothèque C avec Swift en préparant une carte de module.
Le modulemap peut ne pas fonctionner d'un seul coup, alors soyez prêt et préparez-le comme un ensemble.
Un exemple de carte de module est décrit dans le matériel de référence.
Recommended Posts