tag:crieit.net,2005:https://crieit.net/tags/Swift4.2/feed 「Swift4.2」の記事 - Crieit Crieitでタグ「Swift4.2」に投稿された最近の記事 2018-10-31T10:45:15+09:00 https://crieit.net/tags/Swift4.2/feed tag:crieit.net,2005:PublicArticle/14580 2018-10-24T11:05:11+09:00 2018-10-31T10:45:15+09:00 https://crieit.net/posts/Swift-Static 手探りSwift: Staticメンバーをクラス内で呼ぶときにクラス名を書かなくちゃいけない <p>Swiftはstaticメンバーをクラス内で呼ぶときに、C#のようにメンバー名だけでは呼べなくて<code>className.memberName</code>のように書かなくてはいけない。これが馴染めない。タイプ数を問題にしているのではない。</p> <p>クラスの内側でクラス名が出てくると遠近が混乱して頭に余計な負荷がかかる。クラス名は外側の名前なのに、内側で出てくると他の内側の構成要素の語彙と馴染まない。固有名詞を出す必要のない場面で固有名詞が登場する。代名詞で十分である。</p> <p>あまりいいアイデアとも思えないけど、いい方法が見付かるまでの次善の策を思いついた。<br /> クラス名に外側の意味を持たない別名を付ける。下の例だと<code>Type</code>だけど、これは<code>Static</code>でも、<code>Class</code>でもなんでもいい。</p> <p>typealiasは実行時コストがゼロ(?)だから、純粋に表現の問題として扱える...はず。<br /> staticメンバーにアクセスするインスタンスメンバーを用意する方法もあると思う。そちらもコンパイル時の最適化によってコストゼロになりそうだけど、今の自分では判断ができなかったので避けた。</p> <h1 id="例"><a href="#%E4%BE%8B">例</a></h1> <p>こういう POSOがあったとして</p> <pre><code class="swift">struct Supercalifragilisticexpialidocious { var dateStr = "" } </code></pre> <h3 id="Before"><a href="#Before">Before</a></h3> <pre><code class="swift">import Foundation extension Supercalifragilisticexpialidocious { private static var df = ISO8601DateFormatter() var date: Date? { get { return Supercalifragilisticexpialidocious.df.date(from: dateStr) } set { dateStr = Supercalifragilisticexpialidocious.df.string(from: dateStr) } } } </code></pre> <p>DateFormatterのインスタスをstatic変数<code>df</code>にキャッシュしておく。プロパティ<code>date</code>では、<code>df</code>を使って文字列と日付を変換する。<code>df</code>はprivate変数であり内側の構成要素なのだけど、<code>Supercalifragilisticexpialidocious</code>と書かれていることで<code>df</code>が今のスコープの外側のモノという錯覚が生れる。</p> <h3 id="After"><a href="#After">After</a></h3> <pre><code class="swift">import Foundation extension Supercalifragilisticexpialidocious { fileprivate typealias `Type` = Supercalifragilisticexpialidocious private static var df = ISO8601DateFormatter() var date: Date? { get { return Type.df.date(from: dateStr) } set { dateStr = Type.df.string(from: dateStr) } } } </code></pre> <p>自クラスを<code>Type</code>という代名詞で指せるようになった。<br /> 言語の上に、自分ルールを置くことによってコードを読むときのスコープが狭まって読みやすくなったと思う。ただしルールは増えたし、そのルールは自分しか知らない。</p> あぜち(おばあちゃん)