【Swift4】ゲッター・セッターメソッドをオーバーラードする方法【Objective-C】

2020年8月29日

@property(プロパティ)のsetter(ゲッターメソッド)・getter(セッターメソッド) をoverride(オーバーライド)する方法です。

独自クラスのスーパークラスにあたるプロパティのセッター・ゲッターメソッドをオーバーライドする方法

下記ではUILabelをスーパークラスとした独自のクラス「CustomLabel」を作成しスーパークラスからあるtextプロパティのセッターメソッド 、ゲッターメソッドをオーバーライドする方法をご紹介しています。

Swift4

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    
    let label : CustomLabel = CustomLabel()
    label.frame = self.view.bounds
    label.text = "ラベルです"
    self.view.addSubview(label)
}
class CustomLabel: UILabel {

    override var text: String? {
        get {
            return super.text
        }
        set(value) {
            super.text = String(format:"カスタム + %@",value!)
        }
    }

}

Objective-C

#import "ViewController.h"

#import "CustomLabel.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    CustomLabel *label = [[CustomLabel alloc] init];
    label.frame = self.view.bounds;
    label.text = @"ラベルです";
    [self.view addSubview:label];
}
#import "CustomLabel.h"

@implementation CustomLabel

- (NSString *)getText {
    return super.text;
}

- (void)setText:(NSString *)text {
    super.text = [NSString stringWithFormat:@"カスタム + %@",text];
}

@end

このように「ラベルです」と入れただけなのに、「カスタム + 」がくっついていることがわかります。

独自クラスで作成したプロパティのセッター・ゲッターメソッドをオーバーライドする方法

上記ではカスタムクラスを作成してセッターメソッド 、ゲッターメソッドをオーバーライドしましたが、独自に作成したプロパティのセッターメソッド 、ゲッターメソッドをオーバーライドすることも可能です。

Swift4

var _text : String!
var text : String {
    get {
        return _text
    }
    set(value) {
        _text = String(format:"カスタム + %@",value)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    
    self.text = "テキストです"
    print(self.text)

}

Objective-C

@interface ViewController ()

@property (nonatomic) NSString *text;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    self.text = @"テキストです";
    
    NSLog(@"%@",self.text);
}

- (NSString *)getText {
    return _text;
}

- (void)setText:(NSString *)text {
    _text = [NSString stringWithFormat:@"カスタム + %@",text];
}

こちらも、「テキストです」と入れただけなのに、「カスタム + 」がくっついていることがわかります。