書いて覚えるSwift入門
第51回 Swiftの5年間を振り返る
Swift 5周年
Swift Version 1のリリースとほぼ同時期のSoftware Desig 2014年12月号から続いてきた本連載ですが,
WWDC19はそれを再確認する場でもありました。とくに図1のSwiftUIというSwiftオンリー,
今回ではSwiftはどう進化してきたかを振り返り,
表1 Swiftのバージョンと環境側の対応
Date | Version | Comment |
---|---|---|
2014-09-09 | 1. | |
2014-10-22 | 1. | |
2015-04-08 | 1. | |
2015-09-21 | 2. | |
2015-10-21 | 2. | |
2016-03-21 | 2. | Open-Sourced |
2016-09-13 | 3. | Playgrounds for iPad |
2017-09-19 | 4. | |
2018-03-29 | 4. | |
2018-09-17 | 4. | |
2019-03-25 | 5. | ABI Stability |
What's in
何につけ進化について調べるということは,
"""
かつてSwiftで複数行にわたる文字列リテラルを記述する方法は用意されておらず,
Swiftの例
var text = [
"zero",
"one",
"two",
"three"
].joined(separator:"\n")
のようにする必要がありましたが,
Swift 4の例
var text = """
zero
one
two
three
"""
と書けるようになりました。
try! Swift // you couldn't
try! Swiftといえば今ではもっとも有名なSwiftカンファレンスですが,
JavaScriptの例
try {
// 例外が発生する可能性がある処理
} catch {
// 例外が発生した場合の処理
}
という書き方をしますが,try
をブロックの指定ではなく例外をthrow
する関数を明示するために使った点。throws
が定義された関数を呼び出す際には必ずtry
かtry!
かtry?
しなければならないため,
Swiftの例
let result = try? throwable()
のように例外が発生したことだけわかればいい場合は,catch
を不要にもできる点が便利です。
indirect
enum
連結リストの実装を考えてみます
Cであれば,
C言語の例
struct linkedlist {
VALUE_T value;
struct linkedlist *link;
};
といったところでしょうか。ところがこれと同じことをSwiftでやろうとすると……,
Swiftの例
struct LinkedList<T> {
var value:T? = nil
var link:LinkedList<T>? = nil
}
error: value type 'LinkedList<T>' cannot have a stored property that recursively contains it
と怒られてしまいます。値型のstruct
ではなく参照型のclass
に変えるとエラーはなくなり,me.
のような循環参照も許されてしまいます。Swift 2でindirect
指定が加わったことにより,
Swift 2の例
indirect enum LinkedList<T> {
case Some(T, LinkedList<T>)
case Nil
}
What's out
次に出て行ったものを見てみましょう。
++ --
かつてはSwiftにも++
および--
演算子が存在しましたが,++
するのは得策ではないでしょう。
かつてのSwiftの例
prefix func ++<N:Numeric>(_ n:inout N)->N {
n += 1
return n
}
今のSwiftの例
postfix func ++<N:Numeric>(_ n:inout N)->N {
let r = n
n += 1
return r
}
引数のvar
かつてのSwiftでは,var
指定することで次のような書き方が許されていました。
かつてのSwiftの例
func fact(_ n:var Int) -> Int {
var r = 1
while 0 < n {
r *= n
n -= 1
}
return r
}
なお,var
指定はinout
指定とは異なることに注意してください。inout
の場合は呼び出し元も書き換わりますし,
このようにinout
と紛らわしいうえ,inout
指定されていないSwiftの引数はすべてlet
になりました。どうしても引数を書き換えたいというのであれば,
今のSwiftの例
func fact(_ n:Int) -> Int {
var r = 1
var t = n
while 0 < t {
r *= t
t -= 1
}
return r
}
Cスタイルのfor;;
ループ
ここまで来れば,
for var i = 0; i < ary.count; i++ {
let v = ary[i]
// ...
}
という構文があったことも驚かないでしょう。もちろんこれは,
for v in ary {
// ...
}
と書いたほうがずっとわかりやすいですし,for(foo; bar; baz){ quux }
,
foo
while bar {
quux
baz
}
と書けるのですからなくても困りません。
foreach
相当の,
Nothing more to take away
Swiftの進化を最も特徴づけているのは,
「完璧なのは,
次回予告
次回はいよいよ最終回。プログラミングという行為の未来を,
本誌最新号をチェック!
Software Design 2022年7月号
2022年6月17日発売
B5判/192ページ
定価1,342円
(本体1,220円+税10%)
- 第1特集
Vimの基本大全
どんな状況でも通用するviの使い方からしっかりと! - 第2特集
ソフトウェア開発のシン常識
ツール,設計,開発スタイルからの多面チェック - 特別企画
Pythonの最新情報をお届け!
PyCon US 2022レポート - 特別企画
MySQL×機械学習 HeatWave MLが変えるデータ活用のかたち
[前編]機械学習アプリ開発に新たな形態をもたらすHeatWave ML - 短期連載
MySQLで学ぶ文字コード
[1]CHARSETがわかれば文字化けは怖くない - 短期連載
新生「Ansible」徹底解説
[2]新旧の大きな変更点とその経緯