Simple example of using Boost Framework math functions in Swift
SwiftBoostExample
I’m new to Swift and it wasn’t immediately clear how to easily import and use Boost Framework functions, so here’s a very basic example for anyone else wanting to do this.
Requirements
- Xcode
- Swift 5.7+
Additional Notes
-
This method uses the
-enable-experimental-cxx-interop
flag which will likely be superseded by-cxx-interoperability-mode=swift-5.9
when Swift 5.9 is officially released -
For more information regarding experimental Swift C++ interoperability see archived README here: https://github.com/apple/swift/blob/05d44b128f1f45cdcf58ebb8df32d223390f6798/docs/CppInteroperability/GettingStartedWithC++Interop.md
-
For more information regarding production-ready Swift C++ interopablility see current README here: https://github.com/apple/swift/blob/main/docs/CppInteroperability/GettingStartedWithC++Interop.md
-
For details about Swift 5.9 see release announcement here: https://forums.swift.org/t/swift-5-9-release-process/63557
Quick Start
- Clone the repository
- Load the included Workspace in Xcode:
./SwiftBoostExample.xcworkspace
- Update signing & capabilities if needed
- Select destination
- And run!
Reference
Installing Boost via CocoaPods (optional)
I found it easiest to install Boost using CocoaPods since it automatically creates a Workspace and .xconfig
file with the appropriate header search paths. Here’s how to do that:
- Install CocoaPods. See instructions here: https://cocoapods.org/
- Create a
Podfile
with the following contents:
target 'SwiftBoostExample' do
use_frameworks!
pod 'boost', '~> 1.51.0'
end
- Open terminal and run
pod install
in the repository root. It may take a very long time to complete the first time.
(Note: Boost 1.51 is rather old but other pod versions were throwing errors during compilation due to missing includes in the podspec. See https://github.com/CocoaPods/Specs/tree/master/Specs/9/9/d/boost for available podspec versions)
Updating compiler flags
- Add the following flags to
Build Settings -> Other Swift Flags
:
-enable-experimental-cxx-interop
-I./BoostFramework
- If you didn’t install with CocoaPods then you also need to add the Boost path to
Build Settings -> Swift Compiler - Search Paths -> Import Paths
Create BoostFramework group, header and modulemap
BoostFramework.hpp
example
#ifndef BoostFramework_hpp
#define BoostFramework_hpp
#define BOOST_NO_EXCEPTIONS
#include <stdio.h>
#include <boost/math/special_functions/prime.hpp>
#include <boost/math/special_functions/zeta.hpp>
#include <boost/throw_exception.hpp>
uint32_t prime(uint32_t n) {
return boost::math::prime(n - 1);
}
double zeta(double z) {
return boost::math::zeta(z);
}
void boost::throw_exception(std::exception const & e){
//TODO: handle exception
}
#endif /* BoostFramework_hpp */
module.modulemap
module BoostFramework {
header "BoostFramework.hpp"
requires cplusplus
}