RxSwiftのサンプルコード見てたらこれは興味深いなと思ったのでメモっとく
具体例としてinitメソッドを抜粋すると、引数にinputとdependencyという2つのタプルを渡している。
class GithubSignupViewModel1 {
// ...中略...
init(
input: (
username: Driver<String>,
password: Driver<String>,
repeatedPassword: Driver<String>,
loginTaps: Driver<Void>
),
dependency: (
API: GitHubAPI,
validationService: GitHubValidationService,
wireframe: Wireframe
)
) {
let API = dependency.API
// ...中略...
}
// ...中略...
}
そのinputとdependancyのタプルにそれぞれの要素を定義している。これで2種類の引数を区分していて、これのもう一つ良い所としてはタプルの要素のアクセスがめちゃくちゃ楽。dependencyタプルのAPIにアクセスするのはdependency.APIでいいという事。
呼び出す側のコードは次のような感じ
override func viewDidLoad() {
super.viewDidLoad()
let viewModel = GithubSignupViewModel1(
input: (
username: usernameOutlet.rx_text.asObservable(),
password: passwordOutlet.rx_text.asObservable(),
repeatedPassword: repeatedPasswordOutlet.rx_text.asObservable(),
loginTaps: signupOutlet.rx_tap.asObservable()
),
dependency: (
API: GitHubDefaultAPI.sharedAPI,
validationService: GitHubDefaultValidationService.sharedValidationService,
wireframe: DefaultWireframe.sharedInstance
)
)
}
要素のみ数えると7つで、Observableとかなんだよってなると思うので少し詳しく書くと、inputにはUIControlを継承したオブジェクト達の値をバインディングすることを目的としていて、dependencyには利用したいAPIやバリデーションなどのビジネスロジックを担当する奴らを渡している。最後のwireframeっていうのはAlertを出すサンプル用のものなので気にしないで欲しい。
追記
そもそも論として
全てのSwiftの関数は、tupleを一つだけ受け取る関数なのである。
なので(input:, dependency:)がそもそも名前無しタプルでそれを踏まえるとめちゃくちゃタプルが多いんで説明が紛らわしいかもねって感じ。
まとめ
- タプルの使い勝手が良い
- 引数が多い時、引数の要素にタプルを渡すのは良いかも
- 引数が明確に役割を分担していてそれを明示する時、引数の要素にタプルを渡すのはいいかも