trimmedTextと のプロパティを作成したいと思いUITextViewますUITextField。これが私がしたことです:
protocol TrimmedTextSupporting: class {
var _text: String? { get }
var trimmedText: String { get }
}
extension TrimmedTextSupporting {
var trimmedText: String {
let text = self._text ?? ""
return text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}
extension UITextField: TrimmedTextSupporting {
var _text: String? {
return self.text
}
}
extension UITextView: TrimmedTextSupporting {
var _text: String? {
return self.text
}
}
が as inおよび as inとして宣言されて_textいるため、プロパティが必要です(なぜyyy?! >_<)。ここで、API が煩雑にならないように、このプロパティを非表示にしたいと思います。textString?UITextFieldString!UITextView
これが私が試したことです:
1) としてマークしprivateます。コンパイラはこれを許可しません:'private' modifier cannot be used in protocols
2) プライベート プロトコルに分離する:
private protocol TextExposing {
var _text: String? { get }
}
extension UITextField: TextExposing {
var _text: String? {
return self.text
}
}
extension UITextView: TextExposing {
var _text: String? {
return self.text
}
}
///////
protocol TrimmedTextSupporting: class {
var trimmedText: String { get }
}
extension UITextField: TrimmedTextSupporting {}
extension UITextView: TrimmedTextSupporting {}
extension TrimmedTextSupporting where Self: TextExposing {
// compiler error
var trimmedText: String {
let text = self._text ?? ""
return text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
}
}
しかし、コンパイラは再び不平を言います:
Property 'trimmedText' must be declared internal because it matches a requirement in internal protocol 'TrimmedTextSupporting'
私はアイデアがありません。