2017-09-14 16 views
0

私はこのようになります列挙型があります:異なるSectionからのものであり、私はどのタイプの検出できるようにしたい、私は別のCustomButtonを持って連結列挙戻り型

class CustomButton { 
    struct Section { 
    enum Root: Int { 
     case rootFirst, rootSecond, rootThird 
    } 

    enum Top: Int { 
     case topFirst, topSecond, topThird 
    } 
    } 

    var type: Any? 
} 

のような何かを行うことによって、すべてのCustomButtonですcustomButton.type

今のところCustomButtonクラスにはtypeという変数を作成しますが、Anyにはさまざまなボタンタイプを格納する必要があるため、varタイプとして作成できます。問題は、typeの変数を取得するたびに、私がtype(of: type)のようなもので作業しているボタンのタイプを確認してから、type(of: buttonType)が報告しているものにAnyタイプをキャストして、topFirstまたはrootSecondにアクセスできるようにしなければならないということです。タイプ上。

これを行う簡単な方法はありますか?私はそこにあると確信していますが、私は数時間の研究の後に何も見つかりませんでした。私はSwiftにとってもかなり新しいです。

ありがとうございます!

+0

'CustomButton'は' UIButton'のサブクラスであるはずですか?どのような異なる値を取ることができるのですか?それは他の 'UIButton'サブクラスか' Section'の異なる値であるはずですか? –

+0

はい、申し訳ありませんが、 'CustomButton'は' UIButton'のサブクラスです。 'type'は' Root.rootFirst'や 'Top.topSecond'のような全てのenumとは異なる値をとるべきです。 –

答えて

2

私はあなたの構造がovercomplicatedあると思うし、多分私はそれを誤解しているが、私はは何がやりたいことは、このだと思う:あなたのSection構造体は全くそれとして本当に構造体ではありません

class CustomButton { 

    enum Section { // Not a `struct`, but an `enum` 
     enum Root: Int { 
      case rootFirst, rootSecond, rootThird 
     } 

     enum Top: Int { 
      case topFirst, topSecond, topThird 
     } 
     case root(Root), top(Top) 
    } 

    var type: Section? 
} 

var cb = CustomButton() 
cb.type = CustomButton.Section.root(.rootFirst) 
cb.type = CustomButton.Section.top(.topSecond) 

メンバーはいません - それは単にスコープです。それが含む可能性のある値を考えるとすぐに、ネストされたenumが本当に答えになることが明らかになります。

+1

私はenumがそれらの内部で定義されたenumを持つことができるということを完全に忘れてしまったので、私の答えは再帰的なenumを使ってポストしようとしていました。 –

+0

@DávidPásztorとにかくあなたの答えを投稿してみませんか?どちらのアプローチも重要ではないので、指導的なものです。 – Grimxn

+0

公平、十分に投稿してください。ありがとう。 –

2

Section構造体を定義する唯一のポイントは、内部に2つの列挙型をラップすることだったと仮定して、再帰的列挙型としてSectionを定義することをお勧めします。

class CustomButton: UIButton { 

    indirect enum Section { 
     case number(Int) 
     case Root(Section) 
     case Top(Section) 
    } 

    var type: Section? 
} 

let rootFirstButton = CustomButton() 
let rootFirstType = CustomButton.Section.Root(.number(1)) 
rootFirstButton.type = rootFirstType 

let topSecondButton = CustomButton() 
topSecondButton.type = CustomButton.Section.Top(.number(2)) 

ベア列挙型は再帰的であるためには本当の必要はありませんから、あなただけの値を取ることができるようにRootTopをしたい、この特定の問題のために、私はおそらく、Grimxnのanswer @使用することを念頭に置いて、ケースnumber、再帰的アプローチを使用している場合は、CustomButton.Section.Root(.Top(.number(3)))の値でさえあります。セクション内にセクションを埋め込む予定がない限り、再帰的にはenumは必要ありません。

+1

努力のためにUpvotedしかし、Grimxnのアプローチは、完璧、素敵できれいです! –