【Swift】Objective-Cで書いたクラスをメソッド単位で少しずつSwiftへ移行する方法
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

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はこう思った。
まだ実際のアプリのコードで検証したわけではないので、もしより良い方法があればぜひお知らせ下さい 🙂
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!





