Swiftの小ネタ
普段Swiftを書いてる皆様用にいくつか振りたい小ネタっていうか話題があるので読んでいってください。
(本当はもっと規模のでっかい話をしたかったんですが間に合いませんでした…iOSDCとか来年のカレンダーには間に合わせます!)
その1:型理論カレンダー用に書いたやつ
Swift書かない人も読むことを想定して書いたやつなので↑には結論を書いてないのですが、この記事の結論は
「Swiftで使われる 型消去
の意味は世間一般とは違うっぽいのであんまでかい声で連呼するとこっちが消されそう…」
です。
その2:tupleについて
- tupleの添字は0始まり派と1始まり派がいる。1始まり派でいうとHaskell(1990年生・
fst
,snd
)やKotlin(2011年生・first
〜)とか。0始まり派は我らがSwift(2014年生)の他にRust(2010年生)など。バージョン上がって0始まり派に寝返ったScalaとかいうのもいるので我々の時代が来ている……かは定かではない。 - 配列と違いtupleは違う型のオブジェクトを持つことができるが、配列のように
tuple[i]
などと動的に要素を指定することはできない。そりゃまあsubscript
の戻り値の型が定まりませんし。- どうにかして定まるような仕組みがあれば書けるとも言える。Scala 3にはパターンマッチにより最終的な型を決定する型が存在する("match type")。この仕組みがSwiftに欲しいかと言われると?うーん……いらないかな…
その3:[SE-0330] Conditionals in Collections
この機能地味に欲しいやつ。まあ本日時点でReturned for revisionなんですが…
私はこう書きたいって過去に3回くらい考えたことある。ありますよね?地味〜にめんどくさいじゃないですか、こう書けないせいで・・
let array = [ "apple", "banana", // ここで一旦配列の宣言を切り上げて `append("peach")` とかするのだるい #if YOU_LIKE_PEACH "peach", #endif "pear" ]
問題点はいくつかあるようで、
let ambiguous = [ #if HOGE "peach", #else "peach": 100 #endif ]
というふうに違う型が来たらどうするのか?とか、これを実現するには実装が複雑になるんじゃという懸念があるらしい。
ちなみに現在、#if
を扱っているのはlibSyntaxだそうです。導入前はAST側に #if
を任せていたとか。
(Source) -> [Parser] -+-> (AST) -> [Sema] -> ... | and +-> (libSyntax) -> [SwiftSyntax, ...]
(Integrating libSyntax into the compiler pipelineの解説 | by Yusuke Kita | Mediumから引用)
Syntax側が担うのだからなんとかなるんじゃ
とか、
#if 配列 #elseif 辞書 #endif
の場合は両者をまとめて扱える専用のノードが必要になるぞ
とか、
そもそも #if
はLexerで扱うべき
とか、
C#でこの手のことが書けるのは条件に合うほうだけを取り込んでいるから(しかし完全に切り捨てているわけでもない)
とか、
などなど。
SE-0330: Conditionals in Collections - #22 by tkremenek - Proposal Reviews - Swift Forums
ちなみにこの話は2018年ごろからあって最近復活したものっぽいです。議論の結果やいかに。