2017-06-26 10 views
0

私はいくつかのデータ型の "Restriction"を書こうとしていますが、RestrictionはInterest(enum)、Experience(年の範囲)、isVerifiedブール値)などです。プロパティ[Restriction]を持つ別のクラスがありますか。スウィフトで使用するデータタイプについてわからない

私はenumを使用することを考えていますが、この列挙型を構築する正しい/より良い方法は何か分かりません。あるいは構造体を使用していますか?助言がありますか?

+0

なぜ 'struct'? – tadman

+0

この場合、struct over enumまたはclassを使用する利点はありますか?私は特にstructに精通していません。 @adadman – cx0618

+0

'' enum'は ''これらのものの一つを ''これらのすべてのもの ''と表現する方法と考えてください。 'enum'はユーザの役割や柔軟性のあるタイプのようなものには理想的です。 'class'はより形式化された' struct'です。 – tadman

答えて

3

それはあなたが「制限」はあなたに意味するが、決定するための方法は、それが何を意味するのか大声で言って、その後、あなたのタイプを選択するために文法を使用することが何であるかを質問から明らかではありません。

構造体は「AND」型です。例:

struct Point { 
    let x: Double 
    let y: Double 
} 

ポイントはx座標とy座標を持ちます。制限に関心と経験レベルと検証ステータスがある場合、それは構造体です。

列挙型は「OR」型です。例:

enum Color { 
    case red 
    case blue 
    case green 
} 

色は赤または青または緑です。列挙型のケースには、関連するデータが含まれている場合もあります。例:

enum Pattern { 
    case solid(Color) 
    case striped(Color, Color) 
} 

パターンは単色で、または2色でストライプ化されています。私たちのタイプを認識するのに役立つ文法にもう一度気をつけてください: "xを持つy OR OR a"

構造体、クラス、およびタプルはすべてAND型です。したがって、それらを分割するためにさらにいくつかのルールが必要です。タプルは基本的に匿名の構造体ですが、戻り値のような一時的な一時的な値のSwiftではほとんど役に立ちます。あなたがタプルのためにtypealiasを作成したいと思えば、おそらく構造体が必要です。私は人々がタプルを過度に使用していることを知っています(Swiftでは他の言語でも意味があります)。

構造体は値型ですが、クラスは参照型です。違いを理解する最良の方法は、値のタイプがで、その値がであることです。 4番の「インスタンス」は4番のインスタンスと同じです。何も4番を所有していません.4番のどこに由来するのかは気にしません。それは価値です。同じことがポイントについても当てはまります。ポイント(1,2)は、番号1と番号2によって完全に定義されます。そのポイントについて他には何も言えません。あなたの型がそのプロパティによって完全に定義されている場合、それは構造体にとっては良いケースです。 2つの値の間の平等を定義するのは容易でなければなりません。

クラスは参照型です。参照型には同一性があります。 2つのインスタンスはすべて同じプロパティ値を持つことができますが、異なる「オブジェクト」になります。 "これはどちらですか?"構造体ではなくクラスを意味します。 2つの変数が "同じオブジェクト"であることを確認したい場合は、クラスを意味します。構造体を使用するにはSwiftに大きなプレッシャーがありますが、実際には、特にiOS開発ではクラスが非常に一般的です。

あなたのタイプが意味するものを考え、明確な言葉でそれを言うと、あなたの問題に適したタイプを見つけるのに役立ちます。これよりも長いバージョンに興味がある場合は、Learning From Our Eldersをご覧ください。


編集:あなたが実際に作成しているものは、述語ですと思います。述語は、ある値が与えられた場合にyesまたはnoを返す関数であり、これはおそらく制限と思われます。あなたが制限のコレクションを望むように見えます。私はあなたがそれらのすべてを一緒にしたいと思う。

述部を作成するには、クロージャを使用するのが非常に便利です。例:あなたは簡単に、制限のグループを構築ANDまたはORでそれらを適用することができます。これにより

struct Element { 
    let interests: [String] 
    let experience: Int 
} 

struct Restriction { 
    let passes: (Element) -> Bool 

    init(hasInterest interest: String) { 
     passes = { $0.interests.contains(interest) } 
    } 

    init(hasAtLeastExperience years: Int) { 
     passes = { $0.experience >= years } 
    } 
} 

let element = Element(interests: ["fishing", "sewing"], experience: 5) 

let restriction = Restriction(hasAtLeastExperience: 2) 
restriction.passes(element) 

など

+0

必ずしもAND型である必要はありませんが、制限は上記のプロパティのいずれかを持つことができますが、これらのプロパティを含まない制限も許可されます。この場合は、これらのプロパティをオプションとして持つenumまたは構造体を使用する必要があります。 – cx0618

+0

どのように使用するかによって異なりますが、多くのオプションを持つ単一の制限ではなく、制限のコレクションが必要なように聞こえます。 –

+0

実際、制限はプロトコルとして最もよく実装されているかもしれませんし、 'struct InterestRestriction'などのさまざまな実装で' [Restriction] 'を持つことになります。このデータ構造をどのように使っているかはまだ分かりませんが、これは最も実現可能性の高い実装のように思えます。 –

2

Structsが比較的小さく、コピー可能な場合はコピーが安全です。これは、クラスで発生した同じインスタンスへの複数の参照よりも安全です。 interestは、enumタイプInterestのリストです。

enum Interest { 

} 

struct Restriction { 
    let interest: [Interest] 
    let experience: Int 
    let isVerified: Bool 
} 
関連する問題