Swift Digest
SE-0134 | Swift Evolution

Rename two UTF8-related properties on String

Proposal
SE-0134
Authors
Xiaodi Wu, Erica Sadun
Review Manager
Chris Lattner
Status
Implemented (Swift 3.0)

01 何が問題だったのか

Swift 3 より前の標準ライブラリでは、String に C 言語の文字列(null 終端された UTF-8 バイト列)を取り出すためのプロパティとして次の2つが用意されていました。

  • nulTerminatedUTF8: null 終端された UTF-8 のバイト列(ContiguousArray<UInt8>
  • nulTerminatedUTF8CString: null 終端された UTF-8 の C 文字列(ContiguousArray<CChar>

これらの名前には、いくつかの問題がありました。

「NUL」という略語が術語として一般的でない

ASCII の \0 を指す呼び名としては “null character” や “null terminator” が一般的で、”null-terminated string” という表現が広く使われています。一方で Swift のプロパティ名は “nul” という ASCII 上の正式な略称を採用しており、一般的な呼び方からずれていました。実際に “NUL-terminated string” と “null-terminated string” では、検索結果で後者の方が1桁多いヒット数になるほど、後者の方が一般的です。

認識しづらく、コード補完で見つけにくい

“NUL” は “null” に比べて視認性が低く、特に lowerCamelCase で nulTerminated と書かれるとさらに認識しづらくなります。また、ソースエディタの補完で “null” と打った場合に nulTerminatedUTF8 / nulTerminatedUTF8CString は候補として出てきません。これは、利用者が「null 終端された文字列が欲しい」と考えたときに、対応するプロパティに素直に辿り着けないことを意味します。

「C 文字列」と「null-terminated」が冗長

C 文字列は定義上 null 終端された文字列であり、”null-terminated C string” という表現は重複を含んでいます。逆に「null-terminated と明示されている」ことで、「C 文字列の中には null 終端されないものもあるのか」という無用な疑問を読み手に抱かせてしまいます。

02 どのように解決されるのか

標準ライブラリに対して次の2つの変更が行われます。

  • nulTerminatedUTF8CStringutf8CString にリネームする
  • nulTerminatedUTF8 を削除する

utf8CString へのリネーム

C 文字列はそもそも null 終端されているものなので、プロパティ名に冗長な “nulTerminated” を含める必要はありません。そこで、先頭の utf8 を小文字化した utf8CString という名前に変更します。これは Foundation の cString(using: .utf8) の命名とも整合します。

let message = "Hello, Swift"

// Before (Swift 2.x)
// let cString = message.nulTerminatedUTF8CString

// After (Swift 3.0)
let cString = message.utf8CString
// cString: ContiguousArray<CChar>

nulTerminatedUTF8 の削除

nulTerminatedUTF8(null 終端された UInt8 の連続配列)は、utf8CString があれば用途を代替できるため、リネームせずにそのまま削除されます。C の API に UTF-8 バイト列を渡したい場合は utf8CString を利用します。

既存コードへの影響

既存のコードに対しては fix-it が提供され、nulTerminatedUTF8CStringutf8CString に置き換える形で移行できます。nulTerminatedUTF8 を使っていた箇所は、utf8CString への置き換えが必要になります。