【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コード)

関連記事

I20160125-104438.jpg

iPhoneアプリの開発に必要なものをまとめてみた

僕はアプリ開発講座を開催していますが、その関係もあって「iPhoneアプリを開発するには、ど

記事を読む

I20150724-135442.jpg

iPhoneのホーム1画面目に置いているオススメなアプリ38本(2015年9月版)

2014年7月に「iPhoneアプリ開発にオススメの本10選(2014年7月版)」という記事

記事を読む

I20150907-185322.jpg

uGUIの使い方が分かる本「uGUIではじめるUnity UIデザインの教科書」

株式会社マイナビ様より献本御礼。 本書は、公式のUIフレームワーク「Unity UI(uGUI

記事を読む

20160724-154909.jpg

デザインの素人がノンデザイナーズ・デザインブックを読んだら、デザインの原則が結構分かるようになった!

ずっとエンジニアとして働いてきてデザインに関してはまったくの素人な僕ですが、「ノンデザイナーズ・

記事を読む

20160804-193842.jpg

【Xcode 7】Storyboardで複数の制約をまとめて追加する方法

Xcode 7のStoryboardで、複数の制約をまとめて追加する方法について解説します!

記事を読む

20160807-113229.jpg

UITableViewのリサイズに合わせて一番下のセルを常に一番下に表示する方法

一番下のセルを表示している状態でUITableViewの下端を上に移動させると一番下のセルが隠れ

記事を読む

I20160129-115948.jpg

【対処法】Swift 2(iOS 9)ではUITextFieldのtextがString?になっている

Swift 1(iOS 8)時代において、UITextFieldのtextプロパティは va

記事を読む

Auto LayoutやStoryboardの仕組みをしっかり理解できる!「UIKit徹底解説」

インプレスジャパン様より献本御礼。UIKit周りを中心に、「Auto Layout」「Story

記事を読む

I20150808-104713.jpg

【Xcode】シミュレーターリストの表示がおかしくなった時の解決方法

Xcodeのシミュレーターリストの表示が、上のスクリーンショットのようにおかしくなってしまっ

記事を読む

20141224-231137.jpg

【Swift】Auto Layoutで特定のデバイス・画面サイズの時だけ制約を変更する方法

Auto Layoutで、特定のデバイスや画面サイズの時だけ制約を変更する方法について紹介したい

記事を読む

I20170228-002742.jpg
約3ヶ月で体脂肪率を6.2%も落とせたキッカケについて

(右上の赤枠内がダイエット開始前、左下の赤枠内が3ヶ月後の数値

I20161224-174949.jpg
「季節の野菜を直接配送!季節のスムージー」を買ってみた

「FiNCモール」で、「季節の野菜を直接配送!季節のスムージー」を

I20161002-152537.jpg
【メンズネイル】東京・新宿のネイルサロンでマットネイルしてもらった

2016年7月18日、東京・新宿のメンズOKなネイルサロン「Tot

I20160925-163452.jpg
タブバーアイコン非選択時の色を変更する方法【iOS 10】

UITabBarControllerで、タブバーアイコン非選択時の

I20160924-123726.jpg
iPad Pro 9.7インチ SIMフリーモデルにFREETELのSIMを入れて使ってみた

今までiPad miniで使っていたFREETELのSIM

→もっと見る

PAGE TOP ↑