2017-03-25 5 views
0

私は私のコードをいくつか含んでいます。このコードは明らかにコンパイルされません。 UIButtonタイプとしてサブクラスタイプをキャストしようとすると、エラーはExpected member name or constructor call after type nameと表示されます。enumをparamとして指定したfuncから別のuibuttonサブクラスを返す方法はありますか?

AppDelegateでこのボタンfuncを呼び出して、そのタイプのUIAppearanceを変更することができます。これが私がインスタンスではなく型を返す理由です。だから、キャストを使うことができないのであれば、ジェネリックスを使うべきか、この問題をすべて間違って考えるのだろうか?どんな洞察にも感謝します。とにかく、特定のタイプのボタンを選択する方法を知りたいので、ジェネリックまたはキャストを使用してそれを行う方法があるかどうかをスタイルすることができます。

enum BtnType : Int { 
    case Primary 
    case Secondary 
} 

func button(type: BtnType) -> UIButton.Type { 
    var button: UIButton.Type 

    switch type { 
     case .Primary: 
      button = PrimaryButton.Type as! UIButton.Type 
     case .Secondary: 
      button = SecondaryButton.Type as! UIButton.Type 
     default: 
      button = PrimaryButton.Type as! UIButton.Type 
    } 

    return button 
} 
(タイプ Button.Typeである)それぞれのメタタイプを返すためにあなたのカスタムボタンタイプの
+0

は、関数が目的のボタン**タイプ**、またはその型の新しいインスタンスを返すようにしたいですか?そのタイプの新しいインスタンスを作成する方がずっと便利です。 –

+0

私はこの 'PrimaryButton.appearance()。backgroundColor =" whatever colour "を実行するので、ボタンタイプを返すようにします。これは、PrimaryButtonをインスタンス化する前に発生します。しかし、あなたは別の仕事を共有して自由に感じている場合。 – user3832583

答えて

1

使用self:それは正確に一度設定しているため

func buttonType(for type: BtnType) -> UIButton.Type { 
    let button: UIButton.Type 
    switch type { 
    case .Primary: button = PrimaryButton.self 
    case .Secondary: button = SecondaryButton.self 
    } 
    return button 
} 

(注)let button: UIButton.Type(代わりにvarの)言うことができますswitchにあります。

AnyButtonSubclass.selfUIButton.Typeなので、as! UIButton.Typeをキャストする必要はありません。

使用例:

let b = buttonType(for: .Primary).init(type: .system) // b is a UIButton 
b.setTitle("Primary", for: .normal) 

について.Type.self

(私はここのクラスに固執するだろうし、物事を保つために、実行時の型対コンパイル時の型に行きません

おそらく、オブジェクトとクラスの使用に慣れています。オブジェクトはクラスのインスタンスです。オブジェクトのタイプは、そのオブジェクトがインスタンスであるクラスです。 1レベル上(したがってメタ)、 あなたはクラスとメタクラスを扱っています。ここで、クラスの型はそのメタクラスです。

構文的には、タイプを書く必要があるとき、またはタイプを書くときはいつも、Foo.Typeと言うことができます。これは変数のタイプ、パラメータのタイプ、またはこの場合の戻りタイプbuttonType(for:)とすることができます。 UIButton.selfは、タイプUIButton.Typeの式です。 UIButtonインスタンスをUIButton型の変数に割り当てるのと同じように、の変数にUIButton.selfを割り当てることができます。

両方のレベル(オブジェクトとクラス、クラスとメタクラス)では、「is-a」の関係があります。任意のサブクラスUIButtonのインスタンスをタイプUIButtonの変数に割り当てることができます。 同様に、UIButton.Typeの変数にSubclassOfUIButton.selfを割り当てることができます。

一部うまくいけば説明のコード:

class PrimaryButton: UIButton { ... } 
class SecondaryButton: UIButton { ... } 

let button = PrimaryButton(type: .system) 
button is PrimaryButton // true 
button is UIButton // true 
button is UIControl // true 
// etc 
button is String // false 
let uibutton: UIButton = button 

let buttonType: PrimaryButton.Type = PrimaryButton.self 
buttonType is PrimaryButton.Type // true 
buttonType is UIButton.Type // true 
buttonType is UIControl.Type // true 
// etc 
buttonType is String.Type // false 
let uiButtonType: UIButton.Type = buttonType 
+0

ありがとう!まさに私が探していたものです。では、どうしてタイプを使用できないのですか?オートコンプリートがオプションを与えたことに気づいたときに私は '.type.type'を試してみました。クラス自体を参照する必要があるため、 '.self'はインスタンス化されていないので理にかなっていますが、' UIButton.type'が動作するので混乱していると思いました。 UIButtonで '.self'を使うこともできます。 – user3832583

+0

これらのことをもう少し説明するために私の答えを後で更新します。私はmakeButtonメソッドを呼び出すべきではないことに注意してください。実際にはmakeButtonを作るのではなく、タイプを返すためです。私もこれを更新します。 – thm

+0

@ user3832583:関数の名前を変更し、「.Typeと.selfについて」セクションを追加しました。私は物事をクリアすることを願っています。 – thm

関連する問題