@usableFromInline は @inlinable な関数から呼び出せるだけですね。名前の通りの説明になってしまいましたが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 です。