2017-06-27 15 views
0

したがって、すべてのUIViewサブクラスのプロパティをmyView.propertyのように設定する必要があります。多くのサブクラスでは、いくつかの特定の機能があります。たとえば、UILabelといっても、そのサブクラスには特定のものだけがラベル付けされているようです。他の要素...UIViewとそのサブクラスで異なるメソッドを持つ同じプロパティ

に同じだから私は本当に次の操作を実行できるようにする必要があります:スウィフトにおけるこのような状況のために設計する方法について

MyView.property.methodSharedByAllUIViewSubclasses 
MyImageView.property.someImageViewSpecificMethod 
MyLabel.property.onlyLabelSpecificMethod 

すべてのヘルプは大歓迎されます。

編集:私はこれを達成するためのプロトコルとプロトコルの拡張機能を使用したいと思い ...迅速な3では

+2

に既存の変数/関数をオーバーライドすることができます。 UILabelを検討してください。 LabelExtendableです。これは空ですが、空のExtendableに準拠しています。したがって、UILabel自体はUIViewから継承される限り、まったく影響を受けません。 UIViewは 'lui'プロパティを持ちます:' let lab = UILabel(); lui = lab.lui'をコンパイルします。何が起こるはずですか?あなたの質問は、 'property'というプロパティのことを話しているようですが、あなたのコードには存在しません。 – matt

+0

また、あなたはタタリアスで非常に不思議な何かをしています。 – matt

+0

まあ、明らかにコードがうまくいかず、私は何をしようとしているのかを説明したいと思っていました。最後の3行は希望の結果です – Ondrej

答えて

2
struct Property<T> { 
    let property: T 

    init(_ obj: T) { 
     property = obj 
    } 
} 

protocol PropertyDSL { 
    associatedtype DSL 
    var property: Property<DSL> { get set } 
} 

extension PropertyDSL { 
    var property: Property<Self> { 
     get { 
      return Property(self) 
     } 
     set { } 
    } 
} 

extension UIView: PropertyDSL {} 

extension Property where T: UIView { 
    func methodSharedByAllUIViewSubclasses() { 
    } 
} 

extension Property where T: UIImageView { 
    func someImageViewSpecificMethod() { 
    } 
} 

extension Property where T: UILabel { 
    func onlyLabelSpecificMethod() { 
    } 
} 
+0

Perfect !!これは@Ondrejが求めたものです。なぜ彼はまだそれを受け入れられた回答としてマークしていないのかわかりません。 –

+0

驚くべきこと、まさに私が心に持っていたものです!ありがとうございます:) – Ondrej

-1

あなたは以下のコードに示すように拡張機能を作成し、標準のクラスにいくつかの追加のプロパティを追加し、それを使用することができますあなたのニーズに応じて複数の場所で。

extension UIView { 
    @IBInspectable var cornerRadius: CGFloat { 
     get { 
      return layer.cornerRadius 
     } 
     set { 
      layer.cornerRadius = newValue 
      layer.masksToBounds = newValue > 0 
     } 
    } 
} 

上記の拡張子は、あなたがUIImageViewのようなのUIViewを継承し、あなたのUIViewまたはそのサブクラスのいずれかにcornerRadiusを追加できるようになります。私は、これはあなたが望むものを達成するためにあなたを助けることを願っています

enter image description here

以下は切り取ら上記のコードの結果です。

0

あなたは私はあなたが起こることになっていると思うものを得ることはありませんすべてのサブクラス

class MyView: UIView { 

    var property: Bool { 
     get { 
      return false 
     } set { 

     } 
    } 
    func propertyFunction() { 
     //methodSharedByAllUIViewSubclasses 
    } 
} 


class MyImageView: MyView { 

    override var property: Bool { 
     get { 
      return false 
     } set { 

     } 
    } 
    override func propertyFunction() { 
     //someImageViewSpecificMethod 
    } 
} 

class MyLabel: MyView { 

    override var property: Bool { 
     get { 
      return false 
     } set { 

     } 
    } 
    override func propertyFunction() { 
     //onlyLabelSpecificMethod 
    } 
} 
+0

私は、Protocolsをタグの状態として使用するSwiftierソリューションを望んでいました... :( – Ondrej