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,
一番変わったのは,
Perl版:POSIX API
食べないでくださーい 食べないでくださーい 食べないよー かばん.txt:\x{304b}\x{3070}\x{3093}.txt
Swift版:Foundation
食べないでくださーい 食べないでくださーい 食べないよー かばん.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年5月号
2022年4月18日発売
B5判/
定価1,342円
- 第1特集
AWSコスト管理の極意
コストの見える化&分析で予想外の請求を防ぐ! - 第2特集
インシデント対応 実践トレーニング
“いざ” に備える訓練規模別対応フロー - 第3特集
2年ぶりの長期サポート版
Ubuntu 22.04 LTS “Jammy Jellyfish” 最速レポート - 短期連載
HashiCorp Vaultではじめるシークレット管理
[2] 動的シークレットで安全性を高めよう