2017-05-22 29 views
2

私はreadOnlyラベルを持つプロトコルを書いています。私はそれを拡張し、準拠型がUITextViewであるデフォルトの実装を与えたいと思います。プライベートセットでプロトコルを拡張するにはどうすればよいですか?

コード:

protocol CountingView { 

    var keyboardLabel : UILabel {get} 
} 

extension CountingView where Self : UITextView { 

    var keyboardLabel : UILabel { 
     get { 
      let label = UILabel() 
      label.textColor = UIColor.white 
      label.translatesAutoresizingMaskIntoConstraints = false 

      return label 
     } 
     private (set) { 
     keyboardLabel = newValue 
     } 
    } 
} 

しかし、私は、私は次のエラーを取得するsetprivateを追加するとき。

期待「取得」、「設定」、「willSet」、または「didSet」キーワードは、私は、このエラーで他の質問を見上げたが、見つかりませんでした アクセサ定義

を開始しますそれらは私のものに関連しています。

+2

拡張機能* *保存されたプロパティを追加することはできません。あなたのセッターは自分自身を再帰的に呼び出すでしょう。 https://stackoverflow.com/questions/44063181/protocol-extension-in-swift-3を比較してください。 @ MartinsR ummm。 –

+0

OK。ここの答えは間違っていますか? – Honey

+0

あなたの*質問*は 'private(set)'をコンパイルする方法です*答えは正しいようです。私のポイントは、コンパイルしてもsetterの 'keyboardLabel = newValue'の*実装*が意図したとおりに動作しないということです。 –

答えて

4

は、あなただけの間違った場所にプライベートを持っている:

private(set) var keyboardLabel : UILabel { 
    get { 
     let label = UILabel() 
     label.textColor = UIColor.white 
     label.translatesAutoresizingMaskIntoConstraints = false 

     return label 
    } 
    set { 
     keyboardLabel = newValue 
    } 
} 
0

は、単にこのようあなたの計算されたプロパティprivateします

public private(set) var keyboardLabel : UILabel { 
    get { 
     let label = UILabel() 
     label.textColor = UIColor.white 
     label.translatesAutoresizingMaskIntoConstraints = false 

     return label 
    } 

    set { 
     keyboardLabel = newValue 
    } 
} 
関連する問題