Swiftのビルド时间と戦うためのprivateなViewModel

Swiftではよくそのビルド时间が问题として话题になります。

  • コンパイラに型推论をさせすぎない
  • 模块分割をする
  • Mac Proを买う

などなど,対策方法はあります。

原因の1つに,ファイル数が増えれば増えるほどビルドに时间がかかるというものがあります。

FiNCでは931ものSwiftファイルが存在していました。。

ドルド时间を検证

実际にファイル数が増えると,どれくらいビルド时间が変わるのかというのを简易的に検证してみました。

ViewControllerとViewModelを1ファイル内に分けずにおき100ファイル持っているプロジェクトA

  #プロジェクトA 
  #ViewController1.swift 
导入UIKit
 类ViewController1:UIViewController { 
 私人让viewModel = ViewModel1() 
  } 
 私有类ViewModel1 { 
  } 

ViewControllerとViewModelを2ファイルに分けた组み合わせを100组持っているプロジェクトB

  #プロジェクトB 
  #ViewController1.swift 
导入UIKit
 类ViewController1:UIViewController { 
 私人让viewModel = ViewModel1() 
  } 
  #ViewModel1.swift 
进口基金会
 类ViewModel1 { 
  } 

プロジェクトABでそれぞれclean buildを10回试してみたところ,プロジェクトAの方が30%ほどビルド时间が短くなるという结果が出ました。

1ViewController,1ViewModel

Swiftの特徴を生かした1ファイル2クラス

FiNCではMVVMを采用していてほとんどの画面で,ViewControllerとViewModelが1つずつセットで存在で。

単纯に考えても1画面につき最低でも2ファイル,TableViewを使う画面ではCellもあるのでもっと沢山のファイルを使います。

画面が増えれば増えるほど大量のファイルを使用することとなるので,なんとかしなければ。

ということで,1つのファイル内にClassを复数书くことができるSwiftの特徴を利用して,新规作成时には1つのファイル内にViewControllerとViewModelをセットでおくことを试しています。

メリットとデメリットを天秤にかけた选択

がViewControllerが肥大になることや,可読性の问题がないわけではありません。

1つのファイル内にClassを复数置くことで起きる问题とビルド时间とを天秤にかけた时に,FiNCではビルド时间の问题解决を优先しました。

尝试! Swiftの「スタートアップのSwift」という讲演では,「最初はミニマムで作り必要な时が来たら変更を加えていく」というような话もありましたが,仆たちも新规作成时にできるだけ无駄なファイルを増やさずに行こうという指南で开発をしています。

新しく加入したメンにはーには少し惊かれることもありますが,UITableViewが书かれたファイル内に复数のUITableViewCellが置かれていたりもします。

同じファイル内にViewControllerとViewModelを置くことでAccessControlを缚ることができます。

 最后的课程FiNCViewController:UIViewController { 
私人让viewModel = ViewModel()
}
 私有最终课程ViewModel {} 

Modelのようにすると,ViewModelという名前を使っても他の画面のViewModelと名前冲突が起きることがありません。

これは思わぬ副产物でした。

浸ームへの浸透

1ファイルに2つのクラスを置くという単纯な话でも,チームメンバーへ新しいやり方を浸透させる部分まで考えないとなかなかうまくいきません。

そこでtry!Swiftの「チームの生产性を改善するために决断疲倦最小化する」という讲演であった,「Xcodeのテンプレートを活用する」という话を参考に,1ファイルにViewControllerとViewModelを书いンプレートファイルを用意することにしました。

记事の中でちょいちょい出てきましたが,FiNCではtry!Swiftへチームメンバー6人で参加していました。

今度は6月のWWDCにみんなで行けないかなーなんて考えています。

にFiNCに兴味がある方はこちらからhttps://www.wantedly.com/projects/71417