Swift今月の13、14日にペパボのお産合宿で音楽位置情報アプリ「Limu」を開発しました。いうか、まだ完成していないので開発しています。iPhoneアプリの本格的な開発は今回が初めてでわからないことばかりでしたが、@nakajijapanに色々教えてもらって、アプリの作り方がわかってきた今日このごろです。LimuはSwiftで開発しており、その中で作った一部をライブラリに切り出したりしてるうちに(tsuchikazu/iTunesSwift)、Swiftの暗黙的な名前空間(namespace)ってこういうことだったのか、と実感できたのでそれをまとめました。名前空間とはここでいう名前空間とは名前空間はソースコード上で冗長な命名規則を用いなくても名前の衝突が起こらないようにし、しかもそれを容易に記述できるようにするためだけの概念のことを指しています。クラス名の衝突について触れていきます。変なprefixをつけるしかありませんでした。これは、外部ライブラリとそれを使うアプリ側やライブラリ間でクラス名などが衝突しないようにするためです。Appleの人曰く、Swiftではこれが解決されており、prefixを付ける必要はないとのことです。6これを読んでもよくわからないので、実際にライブラリを作って説明していきます。Frameworkを作って使ってみる名前空間を理解するために手っ取り早いのは、ライブラリを作って自分で使ってみることです。Frameworkを選択します。Nameにはライブラリ名を入力します。LanguageはSwiftを選択してください。今回はNamespaceSwiftで作成しました。}}ライブラリとしてはこれだけで終わりで、一旦閉じておきます。次に、このライブラリを使うiPhoneアプリを作っていきます。Applicationで作ります。NameはNamespaceSwiftDemoで作成しました。このアプリで先ほどのライブラリを使うために、ライブラリのxcodeprojをドラッグ&ドロップで持っていきます。Librariesの「+」ボタンで、NamespaceSwift.frameworkが選択出来るようになります。これで準備が整いました。Swiftの名前空間(namespace)を試すさて、ようやく本題に入ります。Swiftの名前空間は、JavaのパッケージやPHPのnamespaceのように明示的に指定する方法ではなく、暗黙的に定義されています。Pythonも同じような感じで、暗黙的に定義されるらしいです。targetごと(モジュールと呼ぶのが正しいのでしょうか)に定義されるというか、モジュール名がそのまま名前空間になっています。Nameが名前空間になります。先程のTestクラスは、NamespaceSwiftプロジェクトのTestクラスなので、名前空間を指定してこう書くことができます。ライブラリのTestクラスNamespaceSwift.Test().hoge()一方、アプリ側(ライブラリを使っているNamespaceSwiftDemoプロジェクト)で、classを定義すると、NamespaceSwiftDemoが名前空間になります。そのため、名前空間が別になるので、ライブラリと同じクラス名のTestクラスを作成することができます。}}名前空間を指定することで、クラス名が衝突しても同時に使うことができるのです。アプリのTestクラスになるTest().fuga()ハマリポイント個人的にものすごくハマったポイントがありました。名前空間(モジュール名)と同じクラス名を定義すると、名前空間として解釈されずにクラスとして解釈されてしまうという点です。{}これは、個人的にはバグなんじゃないかと思っているんですけど、モジュール名は非常に気を使う必要がありそうです。まとめということで、Swiftには暗黙的に名前空間が存在しており、知らずのうちにその中でclassを作っていたのでした。これがあるお陰で、今後はライブラリに変なprefixをつける必要がなくなりました。名前の衝突を気にせず、本来あるべき名前をつけていきましょう。紹介したプログラムはGitHubにあげていますので、ぜひ試してみてください。