KMMでアクセス修飾子をつけるとobjcヘッダーファイルが小さくなって嬉しい話
Created at Sun, Sep 5, 2021KMMで作ったライブラリはobjcヘッダーを生成し、それを介してSwift(Xcode)側から読み込むことが出来ます。
Kotlin側で、internalとか、private等のアクセス修飾子をつけることで、objcヘッダーを小さくすることが出来ます。
つけない場合
ktorのHttpClientを例にして説明します。
コンストラクタにアクセス修飾子をつけない、次のようなクラスがあるとします。
import io.ktor.client.HttpClient
class Test1(
private val httpClient: HttpClient
)
これは、次のようなヘッダーファイルを生成します。(一部省略)
...
public class Test1 : KotlinBase {
public init(httpClient: Ktor_client_coreHttpClient)
}
public protocol Ktor_ioCloseable {
func close()
}
public class Ktor_client_coreHttpClient : KotlinBase, Kotlinx_coroutines_coreCoroutineScope, Ktor_ioCloseable {
...
}
...
HttpClientに関連したクラスをobjcヘッダーに公開しています。 ktorは大きいライブラリなので、objcヘッダーがとても大きくなります。
最終的に、2143行のobjcヘッダーになっていました。
つける場合
次に、アクセス修飾子をつけてみます。
import io.ktor.client.HttpClient
class Test2 internal constructor(
private val httpClient: HttpClient
)
これは次のようなヘッダーファイルを生成します。
...
public class Test2 : KotlinBase {
}
internalをつけたので、HttpClientに関連したクラスをobjcヘッダーに公開せずに済みます。
最終的に、112行のobjcヘッダーになっていました。つけない場合に比べると差は歴然です。
まとめ
internalとか、privateとかをつけて、Swift側から見れないようにすると、objcヘッダーファイルが小さくなって少し幸せになります。