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には使えないみたいです。

swift - How to create typealias of a function type which refers to a particular function - Stack Overflow

https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_typealias-declaration

余談

flutter導入すると、kotlin使い、swift使い、typescript使いなんかがプロジェクトに集められると思いますが、 共通認識を持つのが少し苦労します。
dartのこの部分のソースはkotlinではこうです。みたいな会話をswift使いの人に言っても通じません。

逆に、それぞれの言語でのやり方をdartにも持ち込もうとしてしまいがちです。

それぞれのエンジニアがまずはdartの勉強から始めてプロジェクトに参加できればいいですが、 そうもいかないことも時々あると思います。

kotlin、swift両方の文法に詳しい人がFlutterのリードエンジニアで参加できたらいいんでしょうね。