Appleは9月25日(現地時間)、システムコールや低レベルな通貨タイプへの一貫性のあるインターフェイスを提供する「Swift System」をオープンソース化し、Linuxのサポートを追加したことを発表しました(Phoronix)。
元々SwiftはC言語へのインターフェイスをサポートしていますが、SwiftからインポートしたC言語のAPIを使用する場合、エラーが発生しやすく、扱いづらいという問題が存在しました。例えばLinuxやAppleプラットフォームのようなUNIX風システムでopen
システムコールをインポートすると以下のようになります。
func open(_ path: UnsafePointer, _ oflag: Int32) -> Int32 func open(_ path: UnsafePointer , _ oflag: Int32, _ mode: mode_t) -> Int32
関数は型付けが弱く、Swiftの表現力と型の安全性を利用することができないという問題が存在します。
Swift Systemはこの問題を解決するためのもので、例えば、FileDescriptor名前空間ではデフォルトの引数を持つ静的関数としてopen
システムコールを以下のように定義しています。
extension FileDescriptor { /// Opens or creates a file for reading or writing. /// /// - Parameters: /// - path: The location of the file to open. /// - mode: The read and write access to use. /// - options: The behavior for opening the file. /// - permissions: The file permissions to use for created files. /// - retryOnInterrupt: Whether to retry the open operation /// if it throws `Errno.interrupted`. /// The default is `true`. /// Pass `false` to try only once and throw an error upon interruption. /// - Returns: A file descriptor for the open file /// /// The corresponding C function is `open`. public static func open( _ path: FilePath, _ mode: FileDescriptor.AccessMode, options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(), permissions: FilePermissions? = nil, retryOnInterrupt: Bool = true ) throws -> FileDescriptor }
C言語をインポートした関数と比較すると、強力な型が使われていて、エラーがコンパイル時に検出することが可能となっています。また例外は標準の言語メカニズムによってスローされます。
Swift Systemはプラットフォームごとの能力に応じて、個別のAPIと動作を提供するマルチプラットフォームライブラリです。現在全てのシステムコールがサポートされているわけではありませんが、Appleは今後カバー範囲を拡大し、Windows用のSwiftにも継続して取り組むと説明しています。