迅捷的语言。如何通过超类的变量初始化我的类?

时间:2015-02-14 19:08:32

标签: ios swift

我有从UIButton继承的类

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

    }
}

但是我不明白如何通过该类的变量(在我的情况下是init方法中的“button”)初始化我的超类(在我的情况下是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文件

@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

1 个答案:

答案 0 :(得分: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
    }
}

我的建议是重构您的代码。如果您真的需要这种级别的自定义,请创建一个按钮工厂对象,创建所需的按钮,并完全停止使用按钮复制。