以下の内容はhttps://techblog.spiderplus.co.jp/entry/2025/01/30/113000より取得しました。


Objective-CからSwiftリファクタリング時に生成AIを活用した話

はじめに

iOSチームの「パッタイ」です。
普段はiOSエンジニアとしてiOSアプリの開発に携わっています。

経緯

SPIDERPLUSのiOSアプリの運用は10年目以上経過しており、開発当初のiOSのメイン言語としてObjective-Cを使っておりました。
そのため今でもObjective-Cのコードが多く残っており、それによって様々な問題が発生していました。主にSwiftに比べると開発生産性が低いことと、Objective-Cを使うエンジニア採用が難しいことです。

本記事ではObjective-CからSwiftへの移行を実現するために生成AIを活用して省力化した話を紹介します。

ツールの活用

Objective-CコードをSwift化する際に書換作業を手動で行うと、人為的ミスが発生する可能性が高いため、ツールを活用することで防ぐことができます。
そこで今回は事前に2つのツールの比較検証を行いました。

検証したツール

github.com

Objective-CコードをSwiftに自動変換するためのツールです。
コードの構文解析を行い、Swiftの構文に変換することで、手動での変換作業を効率化します。

github.com

AIを活用してコードの自動補完や提案を行うツールです。
開発者がコードを書く際にリアルタイムでサジェストを提供し、コードの効率的な作成を支援します。
Visual Studio Codeなどのエディタと統合して使用でき、様々なプログラミング言語に対応しています。

SwiftRewriterの検証

  • 良かった点
  • 悪かった点
    • SwiftRewriterはXcodeアプリであるためXcodeが対応していないと実行エラーが発生していた(当時Xcodeのバージョン16.0ではコマンドライン実行時にエラーが発生していた)
    • 細かい関数単位での変換処理は非対応

GitHub Copilotの検証

  • 良かった点
    • クラウド上でObjective-C→Swift変換処理しているため作業者のマシン環境に依存せず利用できる
    • ファイル単位だけでなく関数単位でObjective-CSwift変換処理することが出来る
    • GitHub Copilot Chatを活用することで自然言語の命令から変換処理してくれるため、細かい指示が可能
    • Objective-C→Swift変換精度についてはSwiftRewriterよりも変換精度が同等かそれ以上(※パッタイの個人的見解です)
    • Objective-C→Swift変換処理以外の用途でのリファクタ利用が可能
    • Objective-C→Swift変換する処理速度がSwiftRewriterよりも高速
  • 悪かった点
    • 作業効率が悪くなりがちなこと
      • Visual Studio Codeエディタを使ってChat形式でObjective-CObjc→Swift変換しているが、その後に生成されたコードをXcodeエディタ修正しビルド確認する必要があるためVisual Studio CodeエディタとXcodeエディタのアプリ行き来が発生する

採用したツール

以上の検証結果により、課題はあるもののそれ以上のメリットがあると考えたため、GitHub Copilotを採用して活用しています。

Github Copilotを使った変換例

  1. VSCodeでコード変換対象のファイルを開き、コード選択してマウス右クリックから「Copilot > Editor Inline Chat」をクリックします。
    (以下例はSampleTableViewCell.m内にh, mの内容を1ファイルにまとめています)

  2. Chat欄から自然言語でコードに対して変換指示を出します。

  3. 変換されたコードが出力されます。


出力されたSwiftコード

import UIKit

class SampleTableViewCell: UITableViewCell {

    let titleLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()
    
    let iconImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        return imageView
    }()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        contentView.addSubview(titleLabel)
        contentView.addSubview(iconImageView)
        
        NSLayoutConstraint.activate([
            iconImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 15),
            iconImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
            iconImageView.widthAnchor.constraint(equalToConstant: 40),
            iconImageView.heightAnchor.constraint(equalToConstant: 40),
            
            titleLabel.leadingAnchor.constraint(equalTo: iconImageView.trailingAnchor, constant: 15),
            titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -15),
            titleLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor)
        ])
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Github Copilotを活用することで短時間で精度の高いSwiftコード生成ができました。
本コード例は元のObjective-CのSampleTableViewCell.m内にh, mの内容を1ファイルにまとめているのでGithub CopilotによるObjective-C→Swiftへの変換処理後の手修正は発生しませんでした。

通常のObjective-Cのクラスはh, mの2ファイルで管理していることが多いため、
その場合には最初にmファイルに対してObjective-C→Swiftへの変換処理を行い、
その後、hファイルのみに定義されている内容を変換生成されたSswiftファイルに対して手修正するという流れになります。

今後の課題

普段のiOSアプリ開発Xcodeで実装しており、VSCodeのCopilot Chatによるコード変換処理を行うとXcodeエディタとVSCodeエディタのアプリの行き来が発生する難点があります。
Copilot for Xcodeというプラグインがありますので、今後はこちらも活用検証を行いよりスムーズにAI活用できるようにしたいと考えています。

スパイダープラスでは仲間を募集中です。
スパイダープラスにちょっと興味が出てきたなという方がいらっしゃったらお気軽にご連絡ください。




以上の内容はhttps://techblog.spiderplus.co.jp/entry/2025/01/30/113000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14