【发布时间】:2016-02-24 14:18:19
【问题描述】:
我想为UITextView 和UITextField 创建一个trimmedText 属性。这是我所做的:
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
}
}
我需要_text 属性,因为text 在UITextField 中被声明为String?,在UITextView 中被声明为String!(为什么?!>_
这是我尝试过的:
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'
我没有想法。
【问题讨论】:
标签: swift swift-protocols