【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で更新情報をゲット!