LoginSignup
41
15

More than 3 years have passed since last update.

[Swift] @_exportedの挙動調査

Last updated at Posted at 2020-03-20

はじめに

Swiftの@_exportedについて、その挙動を調査したのでまとめる。

@_exportedとは

  • _がプレフィックスとしてついており、Swiftで公式には公開されていないAttribute
  • 以下のようにimport文で利用可能
@_exported import Foo

挙動調査

前提

以下のような3階層のモジュール構成を考える。

├── Main
│   └── Main.swift
├── SubModule
│   ├── SubModule1.swift
│   └── SubModule2.swift
└── SubSubModule
    └── SubSubModule.swift

同一モジュール内への影響調査

SubModule1.swiftにて、@_exported import SubSubModuleを記述する。
ファイルをまたいでSubModule2.swiftでもSubSubModule.swiftのAPIが利用できる。

├── Main
│   └── Main.swift
├── SubModule
│   ├── SubModule1.swift // @_exported import SubSubModuleを記述
│   └── SubModule2.swift // SubSubModule.swiftのAPIが利用できる
└── SubSubModule
    └── SubSubModule.swift

上位モジュールへの影響調査

さらに、Main.swiftにて、import SubModuleを記述する。
モジュールをまたいでMain.swiftでもSubModule.swiftのAPIが利用できる。

├── Main
│   └── Main.swift // import SubModuleを記述、SubSubModule.swiftのAPIが利用できる
├── SubModule
│   ├── SubModule1.swift // @_exported import SubSubModuleを記述
│   └── SubModule2.swift
└── SubSubModule
    └── SubSubModule.swift

おわりに

  • @_exportedをimportに付与すると、同一モジュール内でのimportが不要になる
  • また、上位モジュールが下位モジュールをimportでインポートした場合、下位モジュールで@_exportedでimportされている孫関係にあたる下位モジュールもimportされる
  • 以下のように、UIKitをimportするだけで、FoundationをimportしなくてもFoundationのAPIが利用できることから、UIKit内部で@_exported import Foundationが定義されていると推測される
import UIKit
import Foundation // import不要

参考

41
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
15