2015-02-14 1 views
0

я класс наследуется от UIButtonБыстрый язык. Как инициализировать мой класс переменной суперкласса?

public class MyButton: UIButton { 
    init(button: UIButton) { 

    } 
} 

Но я не понимаю, как инициализировать мой суперкласса (в моем случае UIButton) по переменной этого класса (в «кнопки» в методе инициализации моем случае)?

Решение Objective-C.

.h файла

@interface UIButton(ExtraIntialiser) 

- (id)initWithButton:(UIButton *)button; 

@end 

@interface MyButton : UIButton 
@property (nonatomic, strong) NSObject *myProperty; 
- (id)initWithButton:(UIButton)button someProperty:(NSObject *)someProperty; 

@end; 

.m File

@implementation UIButton(ExtraIntialiser) 

- (id)initWithButton:(UIButton *)button { 
    self = [button copy]; 
    return self; 
} 

@end 

@implementation MyButton 

- (id)initWithButton:(UIButton *)button someProperty:(NSObject *)someProperty { 
    self = [super initWithButton:button]; 
    if (self != nil) { 
     self.myProperty = someProperty; 
    } 
    return self; 
} 

@end 
+0

Что вы делаете, не имеет смысла в Objective-C _or_ Swift. Точно, что вы действительно пытаетесь сделать? – matt

ответ

1

Вы не можете имитировать эту точную картину в Swift, из-за этой линии:

self = [button copy]; 

Swift не позволит вам назначить self. Если вы хотите продолжать использовать этот шаблон, вам придется копировать атрибуты, которые вы хотите по отдельности.

Кроме того, в Objective-C вы используете категорию. В Swift ваш текущий код использует наследование. Если вы хотите имитировать один и тот же шаблон, используйте вместо этого Swift extension.

Вот одна из возможных реализаций. Есть, конечно, и другие подходы:

public class MyButton : UIButton { 
    var myProperty : NSObject? 

    init(button : UIButton) { 
     super.init() 

     commonInit(button) 
    } 

    init(button : UIButton, property : NSObject) { 
     self.myProperty = property 

     super.init() 

     commonInit(button) 
    } 

    func commonInit(button : UIButton) { 
     let controlStates = [UIControlState.Normal, UIControlState.Selected, UIControlState.Highlighted] 

     for controlState in controlStates { 
      setTitle(button.titleForState(controlState), forState: controlState) 
      setImage(button.imageForState(controlState), forState: controlState) 
      setBackgroundImage(button.backgroundImageForState(controlState), forState: controlState) 
     } 
    } 

    public required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 
} 


extension UIButton { 
    func buttonWithButton(button: UIButton) -> UIButton { 
     return button.copy() as UIButton 
    } 
} 

Мой совет был бы вместо этого реорганизовать ваш код. Если вам действительно нужен этот уровень настройки, создайте фабричный объект кнопки, который создает нужные вам кнопки, и прекратите полностью использовать копирование с кнопок.

+0

Да, вам нужно обойти тот факт, что расширение не может вставить назначенный инициализатор в класс. – matt

Смежные вопросы