【Swift4】クラスの判定(型を比較)する方法【Objective-C】

2020年8月27日

クラスの判定(型を比較)する方法です。
Swift4ではクラスの判定方法は2種類あります。

あるクラスを継承しているか比較する方法

Swift4

let label = UILabel()
        
if label is UIView {
    print("一致")
}

if label is UILabel {
    print("一致")
}

Objective-C

UILabel *label = [[UILabel alloc] init];
    
if (![label isKindOfClass:[UIView class]]) {
    NSLog(@"一致");
}

if ([label isKindOfClass:[UILabel class]]) {
    NSLog(@"一致");
}

UILabelクラスのインスタンスをUIView、UILabelのクラスと比較しています。
この場合どちらも一致になります。

UILabelは「NSObject→UIResponder→UIView→UILabel」という継承順でできています。
ですのでUILabelの親クラスであるUIViewも一致という判定になってしまいます。

特定のクラスであるか判定する方法

Swift4

let label = UILabel()

if type(of: label) != UIView.self {
    print("不一致")
}

if type(of: label) == UILabel.self {
    print("一致")
}

Objective-C

UILabel *label = [[UILabel alloc] init];
    
if (![NSStringFromClass([label class]) isEqualToString:@"UIView"]) {
    NSLog(@"不一致");
}

if ([NSStringFromClass([label class]) isEqualToString:@"UILabel"]) {
    NSLog(@"一致");
}

こちらも、UILabelクラスのインスタンスをUIView、UILabelのクラスと比較しています。
この場合、UIViewは不一致、UILabelのみ一致となります。

Objective-Cの場合、一度クラス名を取得したあとにさらに文字列一致で判定する方法で同じような実装を実現しています。