RubyからSwiftの関数を呼ぶ - 呼び方と注意点

-- Views

April 25, 26

スライド概要

このスライド資料は、Lightning Talks on Hakodate Tram at RubyKaigi 2026において、函館どつく前〜十字街の区間で発表したものです。

Rubyから多言語の関数を呼ぶ仕組みがあることをRubyKaigi 2026のセッションで知り、Swiftでもできるはずなので、自分でも試してみました。
スライド中に出現するソースコードは、ChatGPT・Claudeによる生成です。また、生成されたコードやコマンドの検証については、ネット上のブログ記事なども複数参照し、大丈夫そうであることを確認した上で使用しました。

profile-image

ソフトウェアエンジニア|Swift中心にモバイルアプリやウェブ開発をやっています。 ESP32や3Dプリンタ(Ender3 S1 Pro)を活用して、自宅の作業環境をカスタマイズ中。 シンプルで使いやすいものを作るのが理想。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

RubyからSwiftの関数を呼ぶ 呼び方と注意点 鈴木孝宏(sussan0416), 2026-04-25, Lightning Talks on Hakodate Tram at RubyKaigi 2026

2.

路面電車の車内での発表のため 字が大きくになっています

3.

鈴木孝宏 sussan0416

4.

RubyKaigi 初参加!

5.

iOS/macOS エンジニアです

6.

触る頻度 Swift > Ruby

7.

正直、内容は 難しかった😭

8.

でも、言語の 作り手の話を 聞ける👍

9.

印象に残った トーク

10.

A Faster FFI by Aaron Patterson

11.

多言語の関数を 呼ぶしくみ

12.

Swiftも 呼べるはず

13.

昨晩、宿に戻って やってみた

14.
[beta]
import Foundation
@_cdecl("swift_replace_ruby") ←@̲cdeclで、シンボル名を指定
public func swift_replace_ruby(
_ input: UnsafePointer<CChar>
) -> UnsafeMutablePointer<CChar> {
let str = String(cString: input)
let result = str.replacingOccurrences(
of: "Ruby", with: "Swift"
)
return strdup(result)! ←̀result̀の延命措置(ARC管理外)
}
@_cdecl("swift_free")
public func swift_free(_ ptr: UnsafeMutablePointer<CChar>?) {
free(ptr)
←延命したポインタのメモリ解放【重要】
}

15.

swiftc -emit-library -o libreplace_ruby.dylib ReplaceRuby.swift

16.

require 'ffi' module SwiftLib extend FFI::Library ffi_lib "./libreplace_ruby.dylib" attach_function :swift_free, [:pointer], :void class SwiftString < FFI::AutoPointer ←FFIの便利なAutoPointer def self.release(ptr) SwiftLib.swift_free(ptr) ←GCの際にSwift側のメモリ解放 end end attachする際にAutoPointerで受ける指定↓ attach_function :swift_replace_ruby, [:string], SwiftString end ptr = SwiftLib.swift_replace_ruby(ARGV[0]) puts ptr.read_string

17.

$ ruby main.rb "Ruby is fun."

18.

"Swift is fun."

19.

Ruby楽しい!

20.

もっと触って みたくなった

21.

新しいこと 知らないことに 出会う

22.

新鮮なうちに 試す