寄付窓口はこちら

賢者のString | try! Swift Tokyo 2019 2-12

SwiftのString型は、正確さ、パフォーマンス、そして使いやすさの絶妙なバランスを目標にしています。 このトークではString型の背景にある哲学や、私たちがコミュニティとしていかにStringを使ったプログラミングの楽しさと手軽さを追求できるかについてお話しします。

f:id:niwatako:20190322153628j:plain

Apple Swift Standard Libraryチームで働いています。

こちらはジッパー

f:id:niwatako:20190322153653j:plain

お手伝いしてもらいます

数年前私自身重要な質問を自問自答していました

Stringとはなにか、どのように使っているのか。絵文字、ロケール、Stringは人にコンテンツをプレゼンテーションするために使う

フレームワークの専門家に聞いた。パスなど。

プログラマのDNA、システムに組み込まれているもの

Linux開発者はファイルやテキストストリームの話をしてくれました

f:id:niwatako:20190322153804j:plain

学者は、1次元で時空を超えるものだ。

Swiftはこう教えてくれました。

f:id:niwatako:20190322153827j:plain

魔法の粉でUnicodeを何かに変換できる

Stringをもっと楽しくしていく

正しさ、最適さ、バランスを保っている

良いAPIは間違った使い方をさせない。

使い勝手は大事、邪魔なAPIを回避できる。一方、パフォーマンスや正確さに損害を与える。

f:id:niwatako:20190322153926j:plain

矛盾だらけ

f:id:niwatako:20190322153937j:plain

複雑さをこれが追加している。互換性がUnicodeの良いところだが、複雑さがStringに加わってしまっている。

Stringは何で出来ているのか、プログラミング言語に置いては整数の集合。

f:id:niwatako:20190322154014j:plain

最近のプログラミング言語Unicode Scalar値と考える。4つの個別のScalarを見ていく

キャラクタのScalar幅の前提を作っていく。デフォルトでストリングは各長所基礎クラスタ、SwfitではCharacterとよんでいますが、ユーザーが認識する文字とおなじ

f:id:niwatako:20190322154111j:plain

良いデフォルトでバグを回避する

f:id:niwatako:20190322154126j:plain

Stringのコンテンツを見るところでは、バグを排除することができる、ユーザーのコンテンツの前提を作ることはしない。

どういうキャラクターが必要化について均一な形で見ていく。

Unicodeにおいては物事が不明瞭な場合もある。底でできることはトレードオフを比較評価することしか無い

degenerateというのがある

非直感的な動き、Stringにおいては、degenerateが、

キャラクターの文字数は変わらないが代数的推論に違反する。Swift3ではコレクションを使っていない、それによって使い勝手が悪くなっている。 Unicodeは明示的にdegenerate Graphemeを無視している

実際に使われたら動くことが必要、同バランスを保てば良いのか、理論的に可能と言ってモデルを妥協しない

コレクションにしておくことが必要。

f:id:niwatako:20190322154353j:plain

折返しのScalarが真ん中にあることを想定する。

正しい答えはまったくないが、もし確実に正しいと言えない場合にも正しく定義した挙動を持っておく必要がある、ユーザーデータを削除しない、システムセキュリティ苦いのあることをしてはいけない

Stringsの順序について見ていきたいと思います。

ZとO、順番はドイツとスウェーデンで違う

f:id:niwatako:20190322154504j:plain

日本語の場合、長母音は前に来る文字に基づいて変わる。コンテキストセンシティブ、内容に基づく。

アルゴリズムに使われる、検索辞書のルックアップに使われる、マシーンが使われる順序付けが必要。

順序付けはバグを排除しなくてはいけない

合成済みのアキュートがついているのはついていないeと同じとみなされる

環境が変わってもオーダーが変わってはいけない

f:id:niwatako:20190322154617j:plain

オーダリングと比較は高速でなければならない。

String Key Dictionaryに置いては特に設定する必要がある。

マシンの順序付けは環境で変わってはいけない

一貫した形でプログラミングが整備されなくてはいけない

順序は完全に任意。早いものからということに成る。

f:id:niwatako:20190322154734j:plain

パーティーなどで私みたいに人気を博したければNFCのレキソグラフィカルな順序に従う

f:id:niwatako:20190322154746j:plain

レキシグラフィカルは人間が従うものではない。

f:id:niwatako:20190322154846j:plain

f:id:niwatako:20190322154853j:plain

Unicode Scalar Viewにマップする、意味論的にはこちらのほうが正しい、正しいViewを選んでください。

f:id:niwatako:20190322154939j:plain

f:id:niwatako:20190322154944j:plain

Swift3がはじめてソース安定しました、4ではコレクションがストリング向けに準拠、使いやすく、複数行の文字リテラルも導入されました。OSSコミュニティが作った機能です。重要なパフォーマンス改善がありました。メモリが削減されスモールストリングが表示でき比較も早くなりました。

Swift5でキャラクタプロパティ、rawStringリテラル、カスタムストリングインターポレーションなどがサポート

f:id:niwatako:20190322155104j:plain

Lowレベル改善

f:id:niwatako:20190322155109j:plain

今までのところでStringの哲学、歴史を話しました。

次のStringのフェーズを紹介します。今後、StringはどこにProduceを設定すべきか、パフォーマンス改善も期待できるでしょう。使いやすさにフォーカスを当てるべきだと思います。

f:id:niwatako:20190322155157j:plain

人間工学

正規表現、パーシング、修正、一般的に必要な機能

f:id:niwatako:20190322155232j:plain

OSSSwiftの強みはいろいろな見解がコミュニティから投げられる。

ご自身の経験を是非共有してください、現実に即したユースケースを見るほど、コミュニティとして...

f:id:niwatako:20190322155331j:plain

実際のコードなど、それに寄ってモチベーションが上がりコミュニケーションがな何か作ることに寄与する

フォーラムに行ってみてください、Swiftカテゴリはビギナーに優しいところになると思います

f:id:niwatako:20190322155411j:plain

まとめます。

新しいカスタムの補完を導入してよりクリーンなコードを書けるようにしました。StandardLibraryとして利便性が高くなるでしょう。

f:id:niwatako:20190322155446j:plain

f:id:niwatako:20190322155454j:plain

Stringを自分自身のインターポレーションの中でやる。16進法で数字を保管するのはしょっちゅうやっている

Swift5では自分でカスタムインターポレーションに指定できる

f:id:niwatako:20190322155554j:plain

f:id:niwatako:20190322155606j:plain

マッピングされてコードがわかりやすく。

最後のResultがずれている、最低で幅4で無くてはいけない。

特定Stringでパディングを行っていきます

f:id:niwatako:20190322155634j:plain

どれだけ埋めなくてはいけないのか、左側をインターぽレートしていきます。

f:id:niwatako:20190322155722j:plain

f:id:niwatako:20190322155735j:plain

f:id:niwatako:20190322155807j:plain

うまくいきました

f:id:niwatako:20190322155818j:plain

ぜひ独自のコードに当てはめて試してみてください

f:id:niwatako:20190322155830j:plain

表現性や安全性を型に対して見つけられるようになります。

f:id:niwatako:20190322155905j:plain

利便性が高いと思ったものはもしかしたらStandardLibraryの一部に成るかもしれません。

いろいろな方に参加してもらいたいと思います。

f:id:niwatako:20190322155913j:plain

f:id:niwatako:20190322155942j:plain

OSSSwiftワークショップ、明日やります。お会いできるのを楽しみにしています。

f:id:niwatako:20190322160012j:plain