---
title: RubyからSwiftの関数を呼ぶ - 呼び方と注意点
tags: 
author: [Takahiro Suzuki](https://docswell.com/user/sussan0416)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/2EVV21LGEQ.jpg?width=480
description: このスライド資料は、Lightning Talks on Hakodate Tram at RubyKaigi 2026において、函館どつく前〜十字街の区間で発表したものです。  Rubyから多言語の関数を呼ぶ仕組みがあることをRubyKaigi 2026のセッションで知り、Swiftでもできるはずなので、自分でも試してみました。 スライド中に出現するソースコードは、ChatGPT・Claudeによる生成です。また、生成されたコードやコマンドの検証については、ネット上のブログ記事なども複数参照し、大丈夫そうであることを確認した上で使用しました。
published: April 25, 26
canonical: https://docswell.com/s/sussan0416/K7NG3W-2026-04-25-Tram-LT
---
# Page. 1

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

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


# Page. 2

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

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


# Page. 3

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

鈴木孝宏
sussan0416


# Page. 4

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

RubyKaigi
初参加！


# Page. 5

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

iOS/macOS
エンジニアです


# Page. 6

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

触る頻度
Swift &gt; Ruby


# Page. 7

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

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


# Page. 8

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

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


# Page. 9

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

印象に残った
トーク


# Page. 10

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

A Faster FFI
by Aaron Patterson


# Page. 11

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

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


# Page. 12

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

Swiftも
呼べるはず


# Page. 13

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

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


# Page. 14

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

import Foundation
@_cdecl(&quot;swift_replace_ruby&quot;) ←@̲cdeclで、シンボル名を指定
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)! ←̀result̀の延命措置（ARC管理外）
}
@_cdecl(&quot;swift_free&quot;)
public func swift_free(_ ptr: UnsafeMutablePointer&lt;CChar&gt;?) {
free(ptr)
←延命したポインタのメモリ解放【重要】
}


# Page. 15

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

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


# Page. 16

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

require &#039;ffi&#039;
module SwiftLib
extend FFI::Library
ffi_lib &quot;./libreplace_ruby.dylib&quot;
attach_function :swift_free, [:pointer], :void
class SwiftString &lt; 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


# Page. 17

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

$ ruby main.rb
&quot;Ruby is fun.&quot;


# Page. 18

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

&quot;Swift is fun.&quot;


# Page. 19

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

Ruby楽しい!


# Page. 20

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

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


# Page. 21

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

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


# Page. 22

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

新鮮なうちに
試す


