Closureとは?kotlin, swiftエンジニアとflutter導入することの難しい点
始まり
メンバーの一人がこんなflutterのソースを書きました。
import 'package:flutter/material.dart'; // ツッコミどころ。 // 引数も戻り値もないからVoidCallbackでいいと思うし、 // グローバルに宣言するほどでもない // それよりもこれを利用している箇所のメンバ名をわかりやすくすればいいと思う typedef RegisterCallback = void Function(); typedef FinishCallback = void Function(); class RegisterWidget extends StatelessWidget { final RegisterCallback callback; const RegisterWidget({Key? key, required this.callback}) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( child: Text( "登録する", ), onPressed: callback, ); } } class FinishWidget extends StatelessWidget { final FinishCallback callback; const FinishWidget({Key? key, required this.callback}) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( child: Text( "完了する", ), onPressed: callback, ); } }
それでそのメンバーは普段はswiftを書いてるのですが、
typedef RegisterCallback = void Function();
の部分をクロージャと呼んでいました。
RegisterWidgetを初期化するときの引数にクロージャを入れるのは確かだと思いますが。。。
そこで、swiftに詳しくなかったので調べてみました。
swiftのリファレンス
https://docs.swift.org/swift-book/LanguageGuide/Closures.html
クロージャならボディ部分がないとダメっすね。 冷静に考えればそんなに難しいことでもありませんでした。
swiftにtypedefと同等の機能あるのか?
typealiasが似ているみたいですが、functionには使えないみたいです。
https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration
余談
flutter導入すると、kotlin使い、swift使い、typescript使いなんかがプロジェクトに集められると思いますが、
共通認識を持つのが少し苦労します。
dartのこの部分のソースはkotlinではこうです。みたいな会話をswift使いの人に言っても通じません。
逆に、それぞれの言語でのやり方をdartにも持ち込もうとしてしまいがちです。
それぞれのエンジニアがまずはdartの勉強から始めてプロジェクトに参加できればいいですが、 そうもいかないことも時々あると思います。
kotlin、swift両方の文法に詳しい人がFlutterのリードエンジニアで参加できたらいいんでしょうね。