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 が煩雑にならないように、このプロパティを非表示にしたいと思います。text
String?
UITextField
String!
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'
私はアイデアがありません。