この記事は 2026 年 9 月 1 日に投稿しました。

目次
- はじめに
- DartのHashSetで存在しないメソッドを呼び出した場合の処理
- noSuchMethodメソッドの基本的な使い方
- HashSetでnoSuchMethodが呼び出される場合
- noSuchMethodメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetで利用できるnoSuchMethodメソッドについてです。
2. DartのHashSetで存在しないメソッドを呼び出した場合の処理
DartのHashSetはObjectを継承しているため、noSuchMethodメソッドを持っています。
noSuchMethodメソッドは、オブジェクトに存在しないメソッドやプロパティへアクセスしたときに呼び出されるメソッドです。
形式は以下になります。
dynamic noSuchMethod(Invocation invocation)
通常、noSuchMethodは自動的に呼び出されます。HashSetに存在しないメソッドを実行すると、デフォルトではNoSuchMethodErrorが発生します。
import 'dart:collection'; void main() { final numbers = HashSet<int>.from([1, 2, 3]); final dynamic values = numbers; values.unknownMethod(); }
この例では、HashSetにunknownMethodというメソッドが存在しないため、noSuchMethodが呼び出され、例外が発生します。
3. noSuchMethodメソッドの基本的な使い方
noSuchMethodの引数であるInvocationには、呼び出されたメソッド名や引数などの情報が格納されています。
次の例では、noSuchMethodをオーバーライドして、呼び出されたメソッド名を表示しています。
import 'dart:collection'; class CustomHashSet<E> extends HashSet<E> { @override dynamic noSuchMethod(Invocation invocation) { print('存在しないメンバーが呼び出されました'); print('メンバー名: ${invocation.memberName}'); return null; } } void main() { final values = CustomHashSet<int>(); final dynamic dynamicValues = values; dynamicValues.unknownMethod(10); }
Invocation.memberNameには、呼び出されたメソッド名を表すシンボルが格納されます。positionalArgumentsやnamedArgumentsから、渡された引数も取得できます。
4. HashSetでnoSuchMethodが呼び出される場合
HashSetが本来持っているadd、remove、containsなどのメソッドを呼び出した場合、noSuchMethodは呼び出されません。
import 'dart:collection'; void main() { final numbers = HashSet<int>.from([1, 2, 3]); print(numbers.contains(2)); // true numbers.add(4); numbers.remove(1); print(numbers); // {2, 3, 4} }
一方、dynamicとして扱って存在しないメソッドを呼び出した場合は、noSuchMethodの処理対象になります。
final dynamic values = HashSet<int>(); try { values.findValue(); } on NoSuchMethodError catch (error) { print(error); }
noSuchMethodは、動的なAPIの呼び出しを受け付けるラッパーやモックオブジェクトを作成する場合などに利用できます。ただし、通常のHashSet操作のためにオーバーライドする必要はありません。
5. noSuchMethodメソッドを使用する場合の注意点
通常はNoSuchMethodErrorが発生する
HashSetを通常の静的な型で扱い、存在しないメソッドを呼び出そうとすると、コンパイル時にエラーになります。実行時にnoSuchMethodを呼び出すには、dynamicなどを使用します。
オーバーライドする場合はsuperを呼び出す
独自クラスでnoSuchMethodをオーバーライドする場合、処理できない呼び出しはsuper.noSuchMethod(invocation)へ渡す方法があります。
@override dynamic noSuchMethod(Invocation invocation) { if (invocation.memberName == #unknownMethod) { return '独自の結果'; } return super.noSuchMethod(invocation); }
型安全性が低下する
dynamicを使用すると、メソッド名や引数の間違いをコンパイル時に検出できません。可能な限り、HashSetをHashSet<E>やSet<E>として扱い、通常のメソッド呼び出しを使用してください。
HashSetの要素操作とは別の機能
noSuchMethodはHashSetの要素を検索、追加、削除するためのメソッドではありません。
HashSetの要素を操作する場合は、add、remove、contains、lookupなどのメソッドを使用します。
リファレンス
6. おわりに
DartのHashSetで存在しないメソッドを呼び出すと、noSuchMethodメソッドが呼び出されます。
dynamic values = HashSet<int>(); values.unknownMethod();
HashSetでは、デフォルトのnoSuchMethodによりNoSuchMethodErrorが発生します。独自クラスでオーバーライドすれば、存在しないメソッドの呼び出しを独自に処理することもできます。
ただし、dynamicを使用すると型安全性が低下するため、通常のHashSet操作ではaddやcontainsなど、HashSetが提供するメソッドを利用するようにしてください。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイムOSを利用したシステム開発をはじめ、弊社製品のハイブリッドOS Bi-OS など、長年培ってきた組み込み・制御系の技術を活かした開発に取り組んでいます。
また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。
組み込みソフトウェア、モバイルアプリ、Windowsアプリ、Webシステムなど、ソフトウェア開発に関するご相談がございましたら、お気軽にお問い合わせください。
また、ニューラルでは一緒にソフトウェア開発に取り組んでいただける技術者の方も募集しています。
ご興味がございましたら、お気軽にお問い合わせください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688