Я хотел бы создать 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
}
}
мне нужно _text
свойство, потому что text
объявлен как String?
в UITextField
и, как String!
в UITextView
(whyyyy ?!> _ <). Теперь я хотел бы скрыть это свойство, чтобы избежать загромождения API.
Вот что я пробовал:
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'
Я из идей.
являются свойства 'протокола TrimmedTextSupporting' доступны за пределами файла, если он объявлен как частный? –
@deville Нет, это должно быть в одном файле ... Я вижу вашу проблему сейчас. Позвольте мне пойти и продолжить работу над лучшим ответом. – JAL