@usableFromInline
は @inlinable
な関数から呼び出せるだけですね。名前の通りの説明になってしまいましたが (edited)public
でない関数がモジュールを越えて見えないといけないということになります。そのためには public
でなくても ABI を公開しないといけなくて、それを可能にするのが @usableFromInline
です。// Module A import B func a() { b() }
// Module B @inlinable public func b() { print("b") _b() } @usableFromInline internal func _b() { print("_b") }
a
が b
を利用している箇所がインライン化された場合、↓のようになるイメージです。 func a() { print("b") _b() }
@usableFromInline
が @inlinable
でフルにインライン化されたら↓のようなイメージです。 func a() { print("b") print("_b") }
@usableFromInline
の例では a
の中から _b
を呼ばないといけないので internal
な _b
の ABI がモジュールを越えて公開されていなければなりません。それを可能にするのが @usableFromInline
です。