---
title: 他言語のコミュニティにSwiftで貢献する方法
tags: 
author: [Takahiro Suzuki](https://docswell.com/user/sussan0416)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/GJ5M8N8XJ4.jpg?width=480
description: この資料は、 Sapporo.swift #1 で発表した資料です。 https://japan-region-swift.connpass.com/event/393404/
published: July 25, 26
canonical: https://docswell.com/s/sussan0416/5DM3GW-swift-c-attribute
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/GJ5M8N8XJ4.jpg)

他言語のコミュニティにSwiftで貢献する方法
鈴木孝宏 (sussan0416), 2026-07-25,
Sapporo.swift #1
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LE3W8284E5.jpg)

自己紹介
鈴木孝宏（sussan0416）
所属: 株式会社Helpfeel
役職: プロダクトエンジニア、Gyazo担当
北海道との関係
札幌が地元（〜2009, 2025〜）
公立はこだて未来大学出身（2009〜2015）
iOSDC、LT登壇します（プロポーザル）
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/8EDKMZM57G.jpg)

函館といえば…
エンジニアイベントがいろいろありました
Hakodate.swift #1
行きたかったのですが、その日は札幌にいました。
RubyKaigi 2026
初参加、今日はここでの経験と絡めて話します。
NT函館2026mini
デジタル系ものづくりイベント。行ってみたかった。
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/V7PKRDRDJ8.jpg)

今回の話題
から他の言語の関数を呼び出せる仕組みがあるらしい…！
を呼び出せるのかを検証
RubyKaigi関連のイベントでLT
Rubyistの背中を押す
Swiftを通じた、他言語への貢献の可能性
Ruby
Swift
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/2JVVR1RGJQ.jpg)

FFI
FFI: Foreign Function Interface
他の言語の関数を呼び出す仕組み
に準拠した関数を呼び出せる
C ABI (Application Binary Interface)
※ ABI: コンパイル済みバイナリ同士が関数を呼び出すためのルールの一種。FFIでは主に C ABI が利用されます。
※ FFIはRubyのほか、多くの言語で利用されています。
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/5EGLM26DJL.jpg)

じゃぁ、SwiftはC ABIで関数を公開できるのか
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JQYRP4X7P.jpg)

できる！
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/K74W8YQ2E1.jpg)

@c
属性
関数をC言語から呼び出し可能、列挙型をC言語で表現可能としてマークする方
法。
Swift 6.3から導入。SwiftとC言語のコードの統合が容易になる。
10年ほど、非公式の実験的な属性 @_cdecl が広く使われていた。
詳しい情報は、
Swift
https://www.swift.org/blog/swift-6.3-released/#language-and-standard-library
https://github.com/swiftlang/swift-evolution/blob/main/proposals/0495cdecl.md
を知って初めて `@c` 属性を知りました…。
FFI
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/LJ1Y26PKEG.jpg)

簡単な実装例
import Foundation
@c
public func swift_replace_ruby(_ input: UnsafePointer&lt;CChar&gt;)
-&gt; UnsafeMutablePointer&lt;CChar&gt;
{
let str = String(cString: input)
let result = str.replacingOccurrences(of: &quot;Ruby&quot;, with: &quot;Swift&quot;)
return strdup(result)! // ⚠ARC効かなくなる
}
@c(swift_free)
public func swift_memory_free(_ ptr: UnsafeMutablePointer&lt;CChar&gt;?) {
free(ptr) // ⚠使い終わったらメモリ解放のために呼んでもらう
}
（Rubyに何か因縁があるわけではないです）
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJWGRW2P72.jpg)

コンパイルします。
$ swiftc -emit-library -o lib_replace_ruby.dylib ReplaceRuby.swift
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/4EZLR5D673.jpg)

ができました。
dynamic library
$ file lib_replace_ruby.dylib
lib_replace_ruby.dylib: Mach-O 64-bit dynamically linked shared library arm64
参考: iOSDC Japan 2019: ライブラリのインポートとリンクの仕組み… / Kishikawa Katsumi 24:00〜
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/Y76WR91L7V.jpg)

公開されているシンボルも確認できます。
$ nm -gU lib_replace_ruby.dylib
0000000000000cd4 T _swift_free
00000000000009c0 T _swift_replace_ruby
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/G75M8N4M74.jpg)

から呼ぶ例
Ruby
require &quot;ffi&quot;
module SwiftLib
extend FFI::Library
ffi_lib &#039;./lib_replace_ruby.dylib&#039;
attach_function :swift_free, [:pointer], :void
class SwiftString &lt; FFI::AutoPointer
def self.release(ptr)
SwiftLib.swift_free(ptr)
end
end
attach_function :swift_replace_ruby, [:string], SwiftString
end
ptr = SwiftLib.swift_replace_ruby(ARGV[0])
puts ptr.read_string
側で公開したシンボルのattach処理と、使用を終えたインスタンスのメモリを解放する例
Swift
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/9J29K5VRER.jpg)

$ ruby replace_ruby.rb &quot;I like Ruby.&quot;
I like Swift.
からSwiftの関数を呼べた！
Ruby
（Rubyに何か因縁があるわけではないです）
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/DEY4NK35JM.jpg)

@c
で使える型
公開する関数の引数・返り値の型は、Cで表現できる型のみ。
Int, UInt, Int8, Float, Double, Bool, etc.
CChar, CInt, CUnsignedInt, CLong, CLongLong, etc.
など（SE-0495を参照）
関数の中では、通常通り、Swiftの型を使える。
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/VJNYXRV478.jpg)

活用の可能性
既存のSwiftコードの活用
他言語の実装の一部をSwift化
VisionやFoundation Modelsにアクセスしやすくする
Swiftで、他言語の開発に貢献できる期待
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/YE9P8M64J3.jpg)

の関連イベントでLT
RubyKaigi
終了後に、函館市電の車内でLTしました。
RubyKaigi
https://smarthr.connpass.com/event/385269/
https://www.docswell.com/s/sussan0416/K7NG3W-2026-04-25-Tram-LT
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/GE8D8LZVED.jpg)

をきっかけに知識の環流が起きる
LT
の内容について、bashさんのブログ
RubyからSwiftを呼び出すお話をきいてこれは実用的だ！と思い、帰って試しまし
た。
LT
https://retrospective.hatenadiary.com/entry/2026/05/02/114306
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/LELMRLDR7R.jpg)

の
実行をRubyで完結
Vision framework OCR
さんのブログによると…
Swiftで書いたCLIを外部プロセスとして呼び出す方式だった
Rubyのプロセスで完結するようシンプルな構成にすることができた
とのこと。
https://github.com/bash0C7/rb-vision-ocrmac として公開されています
bash
余談: bashさん、iOSDCのルーキーズLTで登壇されるそうです(プロポーザル)
（この話題ではなさそう）
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/4JMYRMPPJW.jpg)

段階的なSwiftの導入ができている例では……!?
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/PJR9RV1Y79.jpg)

他言語のコミュニティへ行くと…
自分がメインで使う技術以外のイベントに参加してみると、新しい発見や刺激を
受ける
広がった興味で得た知識を還元する、それがまたSwiftへ還元する…
好奇心のループ・知識のループが生まれる
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/PEXQRZY4JX.jpg)

を通じた、他言語への貢献の可能性
Swift
他言語のコミュニティへ行く
その言語が困っていること、欲しがっている機能を知る。
Swiftの得意分野と接続する
Apple Framework、安全なネイティブ実装、既存Swift資産などを提供する。
@c で小さく公開する
@c で境界を作り、相手の言語からFFIで呼べる形にする。
このような関わり方であれば、普段使っているSwiftを通して、他の言語のコミュニテ
ィに貢献することができるかも…！
22


