Avatar
Avatar
Taketo Sano
usableFromInline と inlineable の違いがいまひとつ分かっていないです🤔
@usableFromInline@inlinable な関数から呼び出せるだけですね。名前の通りの説明になってしまいましたが💦 (edited)
8:46 AM
@Taketo Sano クロスモジュールでインライン化されるということはその body が呼び出し側に埋め込まれることになります。そうすると、そのインライン化された関数の中から呼ばれている public でない関数がモジュールを越えて見えないといけないということになります。そのためには public でなくても ABI を公開しないといけなくて、それを可能にするのが @usableFromInline です。
8:47 AM
// Module A import B func a() { b() } // Module B @inlinable public func b() { print("b") _b() } @usableFromInline internal func _b() { print("_b") }
8:48 AM
↑の場合に ab を利用している箇所がインライン化された場合、↓のようになるイメージです。 func a() { print("b") _b() }
8:49 AM
一方でもし @usableFromInline@inlinable でフルにインライン化されたら↓のようなイメージです。 func a() { print("b") print("_b") }
8:50 AM
@usableFromInline の例では a の中から _b を呼ばないといけないので internal_b の ABI がモジュールを越えて公開されていなければなりません。それを可能にするのが @usableFromInline です。
👌 3
8:51 AM
という理解です。間違いがあれば指摘下さい。