ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

appのnamespace

iOSアプリで複数のバージョンを作成する場合Xcodeのターゲットを複製して変更していく。
例えば Foo アプリがあってLite版で Foo Lite を作成するとする。

するとアプリの名称はFoo Liteとなる。
しかし、NamespaceもFoo Liteとなってしまう。
クラスに属さないfuncでNamespaceを指定しなければならいな(名称が他のクラスと曖昧になる場合)時に困る。

ContentView内に同じhello() functionがあるため、Namespaceを指定して区別している。
Textで呼び出しているFoo.hello()がそれに当たる。

import SwiftUI

func hello() -> String {
    return "Hello, world! of Gloval"
}

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text(Foo.hello())
        }
        .padding()
    }
    
    func hello() -> String {
        return "Hello, world! in ContentView"
    }
}

これが、Foo Liteターゲットに変更すると

Text (Foo_Lite.hello())

に書き換えなければならなくなる。

#ifで切り替えてもいいが数が多い場合は辟易してしまう。

Build settings に Product Module Name があるので元の Foo に変えるとソースの変更が不要になる。

もう一つ、ターゲットを複製するとSchemaのコピーもできるのだが、Foo copy という名称になる。
これもFoo Liteと一致する様にしたいのだが、変更方法がしばらく分からなかった。

単純に一覧で項目を選んで Return キーを押すだけなんだが気づきにくい。

Stackoverflowで見つけて解決した。
stackoverflow.com