Я конвертирую этот проект Objective-C (TSCurrencyTextField) в Swift. Это подкласс UITextField
отформатированный для принятия валютных значений. Это файл .m
который я пытаюсь преобразовать.
В нем метод shouldChangeCharactersInRange
UITextField
shouldChangeCharactersInRange
с параметром типа TSCurrencyTextField
. Подобно этому (посмотрите на самый последний метод),
@interface TSCurrencyTextFieldDelegate : NSObject <UITextFieldDelegate>
@property (weak, nonatomic) id<UITextFieldDelegate> delegate;
@end
@implementation TSCurrencyTextField
{
TSCurrencyTextFieldDelegate* _currencyTextFieldDelegate;
}
- (id) initWithFrame: (CGRect) frame
{
self = [super initWithFrame: frame];
if ( self )
{
[self TSCurrencyTextField_commonInit];
}
return self;
}
- (void) TSCurrencyTextField_commonInit
{
// ...
_currencyTextFieldDelegate = [TSCurrencyTextFieldDelegate new];
[super setDelegate: _currencyTextFieldDelegate];
}
- (void) setDelegate:(id<UITextFieldDelegate>)delegate
{
_currencyTextFieldDelegate.delegate = delegate;
}
- (id<UITextFieldDelegate>) delegate
{
return _currencyTextFieldDelegate.delegate;
}
@end
@implementation TSCurrencyTextFieldDelegate
- (BOOL) textField: (TSCurrencyTextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string
{
// ...
}
@end
Здесь мой быстрый переход.
protocol CurrencyTextFieldDelegate: NSObjectProtocol, UITextFieldDelegate {
weak var delegate: UITextFieldDelegate? { get set }
}
public class CurrencyTextField: UITextField {
override public var delegate: UITextFieldDelegate? {
get {
return self.delegate as? CurrencyTextFieldDelegate
}
set {
self.delegate = newValue
}
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
private func commonInit() {
}
}
// MARK: - CurrencyTextFieldDelegate
extension CurrencyTextField: CurrencyTextFieldDelegate {
public func textField(textField: CurrencyTextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return false
}
}
Но я получаю следующую ошибку.
Objective-C method 'textField: shouldChangeCharactersInRange: replacementString:' предоставляется методом 'textField (: shouldChangeCharactersInRange: replacementString :)' конфликтует с необязательным требованием метода 'textField (: shouldChangeCharactersInRange: replacementString :)' в протоколе 'UITextFieldDelegate'
Как исправить эту ошибку?
Для того, что вы пытаетесь выполнить, вам не нужно подклассифицировать UITextFieldDelegate.
Вместо этого в методе init добавьте цель к себе с соответствующей функцией.
override init(frame: CGRect) {
super.init(frame: frame)
self.addTarget(self, action: "formatText", for: .editingChanged)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.addTarget(self, action: "formatText", for: .editingChanged)
}
func formatText() {
// Edit self.text here
}
Obj-c намного более свободен и прост с типами и проверками компиляции, где Swift нет. В swift вы должны реализовать функцию делегата, поскольку она объявлена, а не пытаться изменить любые типы. Затем внутри реализации можно проверить тип (используя if let
).