今回は久しぶりに新ハードウェアがどっさりと発表されました。それも2時間30分超えのキーノートの大半の時間を使って。新OSもつつがなく発表されたとはいえ、
とは言っても現行MacはCPUがKaby Lakeにアップデートされただけのように見えますし、

なぜAppleはこれらの新製品発表の場としてSpecial EventではなくWWDCを選んだのでしょう?
本番は「プラットフォーム一般教書演説」
むしろWWDCとしての本番は、
Swift Playgrounds meets robots
本連載の主題はAPIではなくSwiftという言語。そこに焦点をあてるとSwift PlaygroundsでドローンやLEGO MINDSTORM EV3をプログラムできるようになるという発表

Swiftで書き直されたXcode Source Editor
とはいえ本連載をお読みの読者のほとんどは、


iOSアプリでもあるSwift Playgroundsと同様、
圧巻なのは、
それが、

プロトコルを追加した時点で適合性がチェックされるところまでは今までどおりですが、
エディタの機能が増えると心配なのが
Swift 4「簡単なことはより簡単に」
開発用のMacもXcodeも明らかに改善されたのを確認できた今回のWWDCですが、
言語仕様自体は、
private
宣言がより自然になったので、fileprivate
はほぼ不要に。プレゼンテーションでは「これでアクセスコントロールに関してはおしまい」 という言い方でこの変更についての説明を締めくくっていた - プロトコル宣言で新たなプロトコルを宣言しなくても、
プロトコルを合成できるように。 P&Q
と書けば、「プロトコルPとプロトコルQ双方に適合するタイプ」 と解釈される。あとのコードサンプルにも実例が出てくる Sequence
の要素を指定するのに、Iterator.
と書かずにElement Element
だけでよくなった
たとえばSwift 3では、
extension Sequence
where Iterator.Element: Equatable
{
func containsOnly(
_ value: Iterator.Element
) -> Bool {
return !contains { $0 != value }
}
}
と書かなければならなかったのが、
extension Sequence
where Element: Equatable
{
func containsOnly(
_ value: Element
) -> Bool {
return !contains { $0 != value }
}
}
で済むように。Protocol Oriented Programmingがますますはかどります。内部的には、
protocol Sequence {
associatedtype Iterator: IteratorProtocol
// ...
}
protocol IteratorProtocol {
associatedtype Element
// ...
}
となっていた定義を、
protocol Sequence {
associatedtype Element
associatedtype Iterator: IteratorProtocol
where Iterator.Element == Element
// ...
}
protocol IteratorProtocol {
associatedtype Element
// ...
}
としたとのことです。見ればなるほどですね。
String
がCharacter
のCollection
に
しかし一番歓迎な変更は、String
がCharacter
をElement
とするCollection
になったことでしょう。今まで、
let animals = "🦏 🐫 🐍 💎"
for c in animals.characters {
print(c)
}
として.characters
プロパティにアクセスしないと取り出せなかったのが、
let animals = "🦏 🐫 🐍 💎"
for c in animals {
print(c)
}
と書けるということです。もちろん今までどおり、.utf8
や、.unicodeScalars
は健在です。
ここで
let flags = "🇯🇵 🇺🇸"
flags.count // 2
flags.unicodeScalars.count // 4
flags.utf8.count // 16
となります。なお、.characters
も用意されているので、
あと、"""
で複数行String
リテラルもサポートされます。次に紹介するCodable
と組み合わせると、
Codable
プロトコル
筆者が最も感銘を受けたのが、Codable
プロトコルの追加です。本連載の第25回で、
struct Point2D
<F:FloatingPoint>
{
let x:F
let y:F
}
という簡単なタイプがあったとします。これをJSONで扱いたいとしたらどうするか? こうするだけでよいのです。
struct Point2D
<F:FloatingPoint & Codable> : Codable
{
let x:F
let y:F
}
そう。ストアドプロパティがすべてCodable
でありさえすれば、Point2D
からJSONデータへ。
let p = Point2D(x:42.0, y:0.195)
let j = try JSONEncoder().encode(p) // Data型
String(data: j, encoding: .utf8)
// {"x":42,"y":0.19500000000000001}
次はその逆。
let pp = try JSONDecoder()
.decode(Point2D<Double>.self, from:j)
ここでおもしろいのは、.decode
の第一引数が型になっていることです。try
しているので、throw
することは言うまでもありません。
鋭い読者であればすでに察しているとは思いますが、[Codable]
も[String:Codable]
もCodable
なので、JSONEncoder
のみならずMessagePackEncoder
やYAMLEncoder
がリリースされることも期待されます。
ほかにもRange
がstart...
と書かなくても、start...
だけでstart
から最後の要素までの意味になったりと、
APFS Update
LeopardにSnow Leopard、
一番変わったのは、
食べないでくださーい 食べないでくださーい 食べないよー かばん.txt:\x{304b}\x{3070}\x{3093}.txt
食べないでくださーい 食べないでくださーい 食べないよー かばん.txt: ["\u{304B}", "\u{306F}", "\ u{3099}", "\u{3093}", ".", "t", "x", "t"]
やや奇妙なことに、\ u{304b}\ u{3070}\ u{3093}.txt
と"\u{304B}\u{306F}\u{3099}\u{3093}".txt
が同じファイル名だと認識されています。
次回予告
というわけでSwiftを取り巻く環境の今後の方向性も見えたところで今月の記事は結びです。次回はSwift 4を見据えつつ、
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/
定価1,342円
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」 「使いたい」 「発信したい」 をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画] Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編] リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回] 文字コードのハマりどころTips集 - 短期連載
新生「Ansible」 徹底解説
[4] Playbookの実行環境 (基礎編)