【Swift】Objective-Cで書いたクラスをメソッド単位で少しずつSwiftへ移行する方法

公開日: : 最終更新日:2016/02/10 iPhoneアプリ開発

20150714-010114.jpg

Objective-Cで作った既存のアプリをSwiftで書き直したいと思っているのですが、一気に書き換えていくのは大変そうですし、気が重くなりますし、新たなバグも埋め込んでしまいそうです。

そこで、Swiftのエクステンション(extension)を使って、メソッド単位で少しずつ移行していく方法を考えてみました。

    

移行前のObjective-Cコード

Objective-Cで書かれた以下の様なクラスがあったとします。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (int)methodA;
- (int)methodB;
- (int)methodC;

@end

    

ViewController.m

#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"%d", [self methodC]);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (int)methodA
{
    NSLog(@"ObjC methodA");
    return 111;
}

- (int)methodB
{
    NSLog(@"ObjC methodB");
    return [self methodA];
}

- (int)methodC
{
    NSLog(@"ObjC methodC");
    return  [self methodB];
}

@end

viewDidLoad → メソッドC → メソッドB → メソッドAという順番で処理を呼んでいます。

    

メソッドを1つだけSwiftに移行する

上記の状態から、メソッドを1つだけSwiftに移行してみます。

ViewController.swift

import Foundation

extension ViewController {
    func methodB() -> Int32 {
        println("Swift methodB")
        return self.methodA()
    }
}

    

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (int)methodA;
//- (int)methodB;
- (int)methodC;

@end

    

ViewController.m

#import "ViewController.h"

#import "TransitionSample-Swift.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSLog(@"%d", [self methodC]);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (int)methodA
{
    NSLog(@"ObjC methodA");
    return 111;
}

//- (int)methodB
//{
//    NSLog(@"ObjC methodB");
//    return [self methodA];
//}

- (int)methodC
{
    NSLog(@"ObjC methodC");
    return  [self methodB];
}

@end

あとはすべてのメソッドが移行できるまで繰り返し、最後にObjective-C側のクラスを廃止して、Swift側のextensionをclassに書き換えればスムーズに移行できそうな気がします。

    

@akio0911はこう思った。

まだ実際のアプリのコードで検証したわけではないので、もしより良い方法があればぜひお知らせ下さい 🙂

    

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

PAGE TOP ↑