ドキュメントではネストされた型についてのみ言及していますが、それらが名前空間として使用できるかどうかは不明です。名前空間についての明示的な言及は見つかりませんでした。
ドキュメントではネストされた型についてのみ言及していますが、それらが名前空間として使用できるかどうかは不明です。名前空間についての明示的な言及は見つかりませんでした。
回答:
で答えSevenTenElevenにアップルdevのフォーラム:
名前空間はファイルごとではありません。それらはターゲットごとです(「製品モジュール名」ビルド設定に基づく)。つまり、次のような結果になります。
import FrameworkA import FrameworkB FrameworkA.foo()
すべてのSwift宣言は一部のモジュールの一部と見なされるため、 "
NSLog
" と言っても(はい、まだ存在します)、Swiftが "Foundation.NSLog
" と見なしているものを取得しています。
また、Chris Lattnerが名前空間についてツイートしました。
名前空間はSwiftでは暗黙的であり、すべてのクラス(など)は、それらが含まれるモジュール(Xcodeターゲット)によって暗黙的にスコープされます。クラス接頭辞は必要ありません
私が考えていたものとは非常に異なるようです。
forums.developer.apple.com
フォーラムへのリンクが壊れており、残念ながらAppleはそのスレッドを新しいフォーラムサイトにインポートしていません。
私はSwiftの名前空間を熱望的だと説明します。地上の意味のある現実に対応しない多くの広告が出されています。
たとえば、WWDCビデオでは、インポートするフレームワークにクラスMyClassがあり、コードにクラスMyClassがある場合、「名前変換」によって異なる内部名が付けられるため、これらの名前は競合しません。ただし、実際には、独自のコードのMyClassが優先されるという意味で、これらは競合します。「いいえ、フレームワーク内のMyClassを意味します」と指定することはできません。TheFramework.MyClass
いない作業は(コンパイラは、あなたが何を意味するか知っていません、しかしそれはフレームワークでそのようなクラスを見つけることができないと言います)。
私の経験では、Swiftの名前空間はほとんどありません。アプリの1つをObjective-CからSwiftに変える際に、組み込みフレームワークを作成しました。ただし、フレームワークをインポートすると、フレームワーク内のすべてのSwift要素がインポートされます。したがって、やはり、名前空間は1つだけで、それはグローバルです。また、Swiftヘッダーがないため、名前を非表示にすることはできません。
編集:シード3では、この機能が次の意味でオンラインになり始めています:メインコードにMyClassが含まれていて、フレームワークMyFrameworkにMyClassが含まれている場合、前者はデフォルトで後者を上書きしますが、フレームワーク内の1つに到達できます構文を使用してMyFramework.MyClass
。したがって、実際には別個の名前空間の基本があります。
編集2:シード4では、アクセス制御を使用できます!加えて、私のアプリの1つに組み込みフレームワークがあり、確かに、すべてがデフォルトで非表示になっていて、パブリックAPIのすべてのビットを明示的に公開する必要がありました。これは大きな改善です。
Foundation.NSArray
。
これでいくつかの実験をしている間に、ルート「パッケージ」を拡張することにより、自分のファイルにこれらの「名前空間」クラスを作成することになりました。これがベストプラクティスに違反しているかどうか、または私が認識している影響があるかどうかはわかりません(?)
AppDelegate.swift
var n1 = PackageOne.Class(name: "Package 1 class")
var n2 = PackageTwo.Class(name: "Package 2 class")
println("Name 1: \(n1.name)")
println("Name 2: \(n2.name)")
PackageOne.swift
import Foundation
struct PackageOne {
}
PackageTwo.swift
import Foundation
struct PackageTwo {
}
PackageOneClass.swift
extension PackageOne {
class Class {
var name: String
init(name:String) {
self.name = name
}
}
}
PackageTwoClass.swift
extension PackageTwo {
class Class {
var name: String
init(name:String) {
self.name = name
}
}
}
編集:
上記のコードで「サブパッケージ」を作成しても、個別のファイルを使用すると機能しないことがわかりました。たぶん誰かがそれが事実である理由についてヒントを与えることができますか?
上記に以下のファイルを追加します。
PackageOneSubPackage.swift
import Foundation
extension PackageOne {
struct SubPackage {
}
}
PackageOneSubPackageClass.swift
extension PackageOne.SubPackage {
class Class {
var name: String
init(name:String) {
self.name = name
}
}
}
そのスローコンパイラエラー: 'SubPackage'は 'PackageOne'のメンバータイプではありません
PackageOneSubPackageClass.swiftからPackageOneSubPackage.swiftにコードを移動すると、機能します。誰でも?
編集2:
これをいじくり回して、パッケージを1つのファイルで定義することにより、パッケージを個別のファイルで拡張できることがわかりました(Xcode 6.1ベータ2で)。
public struct Package {
public struct SubPackage {
public struct SubPackageOne {
}
public struct SubPackageTwo {
}
}
}
ここに要点の私のファイルがあります:https : //gist.github.com/mikajauhonen/d4b3e517122ad6a132b8
私はこれを使用して達成されていると思います:
struct Foo
{
class Bar
{
}
}
次に、以下を使用してアクセスできます。
var dds = Foo.Bar();
enum
でなくを使用するため、をstruct
インスタンス化することはできませんFoo
。
Swiftはpythonのようにモジュールを使用し(こことここを参照)、@ Kevin Sylvestreが示唆したように、ネストされた型を使用することもできますを名前空間としてます。
そして、@ Daniel A. Whiteからの回答を拡張するために、WWDCでは、彼らはモジュールについて迅速に話していました。
また、ここでは説明されています:
推論された型はコードをより簡潔にし、間違いを起こしにくくしますが、モジュールはヘッダーを排除して名前空間を提供します。
名前空間は、同じでクラスを定義する必要がある場合に役立ちます、既存のフレームワークでクラス名前の。
アプリに
MyApp
名前があり、カスタムを宣言する必要があるとしますUICollectionViewController
。
次のようにプレフィックスとサブクラスを付ける必要はありません。
class MAUICollectionViewController: UICollectionViewController {}
このようにしてください:
class UICollectionViewController {} //no error "invalid redeclaration o..."
どうして?。あなたが宣言したものは、現在のターゲットである現在のモジュールで宣言されているからです。そしてから宣言されているUICollectionViewController
UIKit
UIKit
モジュールます。
現在のモジュール内でどのように使用しますか?
var customController = UICollectionViewController() //your custom class
var uikitController = UIKit.UICollectionViewController() //class from UIKit
それらを別のモジュールと区別する方法は?
var customController = MyApp.UICollectionViewController() //your custom class
var uikitController = UIKit.UICollectionViewController() //class from UIKit
extension
を使用すると、struct
すべてのコードを右にインデントすることなく、前述のsアプローチを名前空間に使用できます。私はこれを少しいじっていましたが、私が作成しControllers
、Views
、以下の例のように名前空間まで行くかどうかはわかりませんが、それがどこまでできるかを示しています:
Profiles.swift:
// Define the namespaces
struct Profiles {
struct Views {}
struct ViewControllers {}
}
プロファイル/ViewControllers/Edit.swift
// Define your new class within its namespace
extension Profiles.ViewControllers {
class Edit: UIViewController {}
}
// Extend your new class to avoid the extra whitespace on the left
extension Profiles.ViewControllers.Edit {
override func viewDidLoad() {
// Do some stuff
}
}
プロファイル/ビュー/Edit.swift
extension Profiles.Views {
class Edit: UIView {}
}
extension Profiles.Views.Edit {
override func drawRect(rect: CGRect) {
// Do some stuff
}
}
このレベルの分離はまだ必要ないので、これをアプリで使用していませんが、興味深いアイデアだと思います。これにより、ユビキタスな* ViewControllerサフィックスなど、煩わしいほど長いクラスサフィックスも不要になります。
ただし、次のようなメソッドパラメータなどで参照されている場合は、何も短縮されません。
class MyClass {
func doSomethingWith(viewController: Profiles.ViewControllers.Edit) {
// secret sauce
}
}
2014年6月10日現在、誰かが興味を持っている場合、これはSwiftの既知のバグです。
セブンテンイレブンから
「既知のバグ、申し訳ありません。rdar:// problem / 17127940モジュール名によるSwiftタイプの修飾は機能しません。」