®️

R.swiftでアクセス修飾子を指定する

2023/07/26に公開

R.swiftのREADME.mdを読むと

.target(
    name: "Example",
    dependencies: [.product(name: "RswiftLibrary", package: "R.swift")],
    plugins: [.plugin(name: "RswiftGeneratePublicResources", package: "R.swift")]
)

と書いてありますが、実はR.swiftのプラグインは次の2つがあります[1]

  • RswiftGeneratePublicResources
  • RswiftGenerateInternalResources

名前の通り、 RswiftGeneratePublicResourcesを使うと、R.generated.swiftで指定されるリソースたちが全て public になります。そのため、リソースの大元も public である必要があり、例えば class ViewController: UIViewController {} などのViewControllerやViewなどに public のアクセス修飾子をつけて回る必要があります。

小規模なアプリであったり、Target内のリソースすべてを他のTargetから使いたい場合は頑張って対応すれば良いですが、多くの場合はTargetを適切に分割し、外部からアクセスしてほしいのは一部のリソースだけになるはずです。

そういった場合は RswiftGenerateInternalResources のプラグインを利用します。こちらのプラグインでは名前の通り、すべてのリソースを internal として定義してくれます。多くの場合ではこちらのプラグインを使うと良いでしょう。

脚注
  1. "Xcode project - SPM" の項では RswiftGenerateInternalResources が紹介されている謎 ↩︎

Discussion