Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
OrganizationEventAdvent CalendarQiitadon (β)
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

SwiftPM で C言語を含むライブラリを作る

SwiftPM で C言語を含むライブラリを作った

WorldInApple の実装


  • 公式ドキュメントの Creating C Language Targets の通りです
  • C++ で実装された World 本体のターゲットを作成し、Swift のラッパーのターゲットから依存させました


-> https://github.com/fuziki/WorldInApple/blob/develop/Package.swift

import PackageDescription

let package = Package(
    name: "WorldInApple",
    platforms: [.iOS(.v11), .macOS(SupportedPlatform.MacOSVersion.v10_15)],
    products: [
            name: "WorldInApple",
            targets: ["WorldInApple"]),
    targets: [
        // C++ で書かれた、World 本体
            name: "WorldLib"
        // WorldLib の Swift ラッパー
            name: "WorldInApple",
            dependencies: ["WorldLib"]),  // WorldLib に依存




-> https://github.com/fuziki/WorldInApple/blob/develop/Sources/WorldLib/include/World.h

  • WorldLib の公開されるヘッダです
  • World の必要なヘッダを公開しています
#import "../world/dio.h"
#import "../world/stonemask.h"
#import "../world/cheaptrick.h"
#import "../world/d4c.h"
#import "../world/synthesis.h"
#import "../world/harvest.h"
#import "../world/synthesisrealtime.h"
#import "../world/matlabfunctions.h"


  • WorldLib の Swift ラッパーです
  • import WorldLib することで、World て定義された機能を利用できます

-> https://github.com/fuziki/WorldInApple/blob/develop/Sources/WorldInApple/WorldInAppleComponents/AperiodicityEstimator.swift

import WorldLib

public class AperiodicityEstimator: WorldInAppleComponents {
    private var d4cOption = D4COption() // World で定義された構造体が利用できる
    public func estimatAperiodicity(x: UnsafeMutablePointer<Double>, x_length: Int32) {
        // World で定義された関数が利用できる
        D4C(x, x_length, Int32(parameters.fs), parameters.time_axis, parameters.f0, Int32(parameters.f0_length), Int32(parameters.fft_size), &d4cOption, parameters.aperiodicity)

サンプルの実装 (Examples)

  • WorldInApple の パッケージから参照されないようにダミーの Package.swift を配置しています

-> https://github.com/fuziki/WorldInApple/blob/develop/Examples/Package.swift

import PackageDescription

let package = Package(
  name: "dummy",
  products: [],
  targets: []
  • WorldInApple.xcworkspace から実行可能です
  • Examples プロジェクトと、WorldInApple のパッケージが入っています


  • Examples ターゲットから WorldInApple を参照しています


  • import WorldInApple することで、作成した World の Swift のラッパーを利用可能です

-> https://github.com/fuziki/WorldInApple/blob/develop/Examples/Examples/Shared/ContentViewModel.swift

import AVFoundation
import Combine
import Foundation
import SwiftUI
import WorldInApple

class ContentViewModel: ObservableObject {

    private let world = WorldInApple(fs: 48000, frame_period: 5, x_length: 38400)
    // 〜中略〜

公開する & 利用する

  • GitHub に push することで、pure swift のパッケージ同様に利用することが可能でした
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Help us understand the problem. What is going on with this article?