モジュールの分割法
前回はswift-floatingpointmathを紹介したところで終わりました。これはもともとモジュールではなくswift-complexの一部として実装されていましたが、
swift-floatingpointmathは何をするモジュールかといえば、
- 0.
FloatingPointMath
というプロトコルの定義 - 1.protocol extensionによる
(Cにおける <math.
やJSにおけるh> Math
オブジェクトが提供する)数学関数の提供 - 2.
Double
およびFloat
のFloatingPointMath
への準拠
実際に中身を見てみましょう。まずはプロトコルの定義から。
Double
から初期化可能であること、Double
へ変換可能であること。つまりDouble
との相互変換が可能である型asDouble
ではなく、
に相当する定義もprotocol FloatingPointMath{}
の内部ではありますが、asDouble
というプロパティを用意しています。
protocol extension
次にprotocol extensionを見てみましょう。次のような定義が、
要するにDouble
に変換してからFoundation
の数学関数で計算した結果をもとの型に戻しているだけですが、FloatingPointMath
に準拠している型はこれらの数学関数を自前で実装しなくても、Double
で計算したのと同様の結果を得ることができるわけです。
そして、Double
およびFloat
もFloatingPointMath
に準拠させるために、
という最低限の拡張を施しています。Double
で数学関数を別途定義しているのは、
一見このモジュールは単なる無駄に見えます。import Foundation
すれば同モジュールが提供している機能はすべて使えるのですから。
しかし、Foundation
には2つの問題があります。
- 0.あまりに多くの関数がトップレベルに
import
される - 1.組込みの数値型しか使えない
たとえばlog
といってもMath.
とConsole.
ではまるで別の意味になりますが、Foundation
のlog
は問答無用でMath.
の意味になります。その一方でNSLog
は後者の意味なのですからややこしい。数学関数だけ、import
する手段がSwift
本体には用意されていないのです。
しかしそれだけであればFloatingPointMath
をわざわざ定義せずとも、Foundation.
と明記すればいいだけです。実際にこの記法はFloatingPointMath
のprotocol extensionでも用いられており、return Foundation.
をreturn acos(x)
と書いたら無限再帰してしまいます。
しかし組込みの数値型しか使えないのは問題です。せっかくSE-0067で浮動小数点が固定的な型ではなくプロトコルとして整理されたのに、Double
とFloat
しか使えないのでは宝の持ち腐れというものではないですか。
実際筆者はswift-bignumというパッケージで任意精度有理数BigRat
と任意精度浮動小数点数BigFloat
を提供しており、FloatingPoint
プロトコルに準拠しています。しかしFloatingPointMath
の数学関数はFloatingPoint
プロトコルでは未定義なので、FloatingPointMath
プロトコルをパッケージとして独立させたうえで利用するようにしま
した。
エレガントに複素数を扱う
こうして
すなわち符号付数値SignedNumeric
)Element
)
と、Element
がFloatingPoint
かつFloatingPointMath
に準拠しているプロトコルとして定義されたうえで、struct
としてComplex
型が定義されています。
つまりComplex
型の要素はDouble
やFloat
だけではなく前述のBigRat
やBigFloat
もそのまま使えるということです。
PONSの爆誕
数学的な数値の性質をプロトコルとしてまとめ、
図1と図2はPONSの型とプロトコルの相関関係
次回予告
今年はSwiftがリリースされてから5年目。不要だった機能は削ぎ落とされ、
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」「使いたい」「発信したい」をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画]Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編]リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回]文字コードのハマりどころTips集 - 短期連載
新生「Ansible」徹底解説
[4]Playbookの実行環境(基礎編)