2017-08-21 10 views
2

定数の列挙を使用するのはシンプルで洗練された解決策です。列挙型を使ってネストされた文字列を出力する方法はありますか?Swiftでネストされた定数を使用する方法

例えば、私は次のコードを持って考えてみます。

enum Const { 
    enum Car { 
     static let Door = "Door" 
     static let Engine = "Engine" 
    } 
} 

は、私が「車|ドア」を得ることができることをとにかくありConst.Car.Doorのための出力として?または "Car | Engine"をConst.Car.Engineの出力として使用しますか? 「車」はConst.Car?の出力になります。現在のプロジェクトで定義されているいくつかの解析定数が名前空間パターンと似ています。ネストされたトラッキングイベントがたくさんあり、私が上で説明したばかりのことを達成できれば、本当に役に立ちます。

は私が必要なもの:

Const.Carは出力 "カー"

Const.Car.Doorが出力与えるべきである与えるべき

| | "エンジンにカー" 出力を与えるべきである "車のドア"

Const.Car.Engine

私はそれを達成する方法について考えていません。

EDIT:たとえば

これも拡張できるべきである、

Const.Car.Door.Handleは出力が得られますが

Const.Planeは「出力を与えるべきである "車| |ドアハンドル"プレーン "

Const.Plane.Flaps出力"プレーン|フラップ "

+0

'Const。(Const.Car.Door'の中で) –

+1

はい、私はそれを理解しています。しかし、列挙型を忘れて、これを実現することはできますか?それは私のコードがより構造化された感じになります。 – CoderFrom94

+1

別の言い方をすると: 'Const.Car ==" Car "'の場合、 'Const.Car.Door'は無効です。 –

答えて

0

私は構造体と列挙型を使用して解決できた同様の問題を以前持っていました。あなたの場合は次のようになります:

struct Const{ 
    enum Car: String { 
     case Door = "CarDoor" 
     case Engine = "CarEngine" 
    } 
} 

print("\(Const.Car.Door)") //CarDoor 
print("\(Const.Car.Engine)") //CarEngine 

私はそれがあなたによく叶ってくれることを望みます。

0

Const.Carを呼び出すとき、それは「カー」を印刷しないように、これはまさにあなたの要件を満たすものではありませんが、起動するために、それはどこかにことがあります

enum Const { 
    enum Car { 
     static let identifier = "Car" 
     static let Door = "\(Car.identifier)Door" 
     static let Engine = "\(Car.identifier)Engine" 
    } 
} 

print(Const.Car.Door) //CarDoor 
print(Const.Car.Engine) //CarEngine 

あなたはConst.Car.identifierを呼び出すことにより、「カー」を印刷することができますしかし、。

2

オペレータのオーバーロードは、同様の機能を実現するのに役立ちます。 私の解決策を見てください、あなたは私が考えることができる

enum Vehicle: String { 
    case car = "Car" 
    case airplane = "Airplane" 

    enum CarPart: String { 
     case door = "Door" 
     case window = "Window" 
    } 
} 

func > (left: Vehicle, right: Vehicle.CarPart) -> String { 
    return left.rawValue + right.rawValue 
} 


let string = .car > .window // "CarWindow" 
+0

しかし、2階層以上の列挙型階層を持つことは、より問題になる可能性があります。このような場合のオペレータの過負荷は達成できますが、実装するのが難しい場合があります。私は個人的に@ j-caicedo解決策を好むだろう –

0

クリーンな方法があり、より多くのそれを拡張することができます

struct Const 
{ 
    enum Car: String, CustomStringConvertible 
    { 
     case Door 
     case Engine 

     var description: String 
     { 
      return "Car\(self.rawValue)" 
     } 
    } 
} 

print("\(Const.Car.Door)") // CarDoor 
print("\(Const.Car.Engine)") // CarEngine 

はあなたが必要なものを実現し、/新しいケースを追加することが本当に簡単になります定型文を持たないパーツです。より多くの車両をサポートしたい場合は、この機能を抽象化するのは簡単です。

関連する問題