-- Views
April 25, 26
スライド概要
このスライド資料は、Lightning Talks on Hakodate Tram at RubyKaigi 2026において、函館どつく前〜十字街の区間で発表したものです。
Rubyから多言語の関数を呼ぶ仕組みがあることをRubyKaigi 2026のセッションで知り、Swiftでもできるはずなので、自分でも試してみました。
スライド中に出現するソースコードは、ChatGPT・Claudeによる生成です。また、生成されたコードやコマンドの検証については、ネット上のブログ記事なども複数参照し、大丈夫そうであることを確認した上で使用しました。
ソフトウェアエンジニア|Swift中心にモバイルアプリやウェブ開発をやっています。 ESP32や3Dプリンタ(Ender3 S1 Pro)を活用して、自宅の作業環境をカスタマイズ中。 シンプルで使いやすいものを作るのが理想。
RubyからSwiftの関数を呼ぶ 呼び方と注意点 鈴木孝宏(sussan0416), 2026-04-25, Lightning Talks on Hakodate Tram at RubyKaigi 2026
路面電車の車内での発表のため 字が大きくになっています
鈴木孝宏 sussan0416
RubyKaigi 初参加!
iOS/macOS エンジニアです
触る頻度 Swift > Ruby
正直、内容は 難しかった😭
でも、言語の 作り手の話を 聞ける👍
印象に残った トーク
A Faster FFI by Aaron Patterson
多言語の関数を 呼ぶしくみ
Swiftも 呼べるはず
昨晩、宿に戻って やってみた
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)
←延命したポインタのメモリ解放【重要】
}
swiftc -emit-library -o libreplace_ruby.dylib ReplaceRuby.swift
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
$ ruby main.rb "Ruby is fun."
"Swift is fun."
Ruby楽しい!
もっと触って みたくなった
新しいこと 知らないことに 出会う
新鮮なうちに 試す