書いて覚えるSwift入門

第28回 WWDC 2017特集

この記事を読むのに必要な時間:およそ 4 分

Swift 4「簡単なことはより簡単に」

開発用のMacもXcodeも明らかに改善されたのを確認できた今回のWWDCですが,肝心のSwift 4はどうでしょう? ⁠一般教書演説」でも少し紹介されていましたが,やはりここはWhat's New in Swiftでもう少し詳しく見ていきましょう。

言語仕様自体は,Swift 3からそれほど変わっていません。Swift 3のリリースのときと同様Swift 4のリリースでは同時にSwift 3.2がサポートされます。ここまでは同様ですが,前回はXcodeにコンパイラーを2種類搭載してそれを実現していたのに対し,今回は同じコンパイラーでそれを実現していることからも2→3ほどの変化ではないことがうかがわれます。とはいうものの,3.xのxの増分では済まない違いも確かに存在します。

  • 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 }
    }
}

と書かなければならなかったのが,Swift 4では,

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
  // ...
}

としたとのことです。見ればなるほどですね。

StringCharacterCollection

しかし一番歓迎な変更は,StringCharacterElementとするCollectionになったことでしょう。今まで,

let animals = "🦏 🐫 🐍 💎"
for c in animals.characters {
    print(c)
}

として.charactersプロパティにアクセスしないと取り出せなかったのが,Swift 4以降は,

let animals = "🦏 🐫 🐍 💎"
for c in animals {
    print(c)
}

と書けるということです。もちろん今までどおり,バイト単位でバラす.utf8や,Unicode単位でバラす.unicodeScalarsは健在です。

ここで「Unicode単位」と言いましたが,Swift 4におけるCharacterは合成文字もきちんと1文字として扱います。なので,

let flags = "🇯🇵 🇺🇸"
flags.count // 2
flags.unicodeScalars.count // 4
flags.utf8.count // 16

となります。なお,今までどおり.charactersも用意されているので,Swift 3以前のコードもそのまま動くはずです。

あと,Pythonと同様の"""で複数行Stringリテラルもサポートされます。次に紹介するCodableと組み合わせると,文字列にとどまらず入り組んだデータの初期化もはかどること請け合いです。

Codableプロトコル

筆者が最も感銘を受けたのが,Codableプロトコルの追加です。本連載の第25回で,JSONタイプを作成しましたが,今後こういったタイプはほぼ不要になるのです。実例を見てみましょう。

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しているので,JSONがこの型に適合していなければthrowすることは言うまでもありません。

鋭い読者であればすでに察しているとは思いますが,当然[Codable][String:Codable]Codableなので,文字列や数値はすぐにこの恩恵を受けられますし,Swift 4以降は標準搭載のJSONEncoderのみならずMessagePackEncoderYAMLEncoderがリリースされることも期待されます。

ほかにもRangestart...endと書かなくても,start...だけでstartから最後の要素までの意味になったりと,Swift PlaygroundsとあわせてますますカジュアルにSwiftを使えるようになるのは確実そうです。

APFS Update

LeopardにSnow Leopard,LionにMountain Lion。そしてSierraにHigh Sierra。AppleがOS XもといmacOSのバージョンをそう命名するときには,外見はあまり変わらずとも内部がガバッと変わるものと相場が決まっていますが,今回の内部は格別に大きい。ついにAPFSがmacOSにも正式導入されるのです。ただし,macOS SierraやiOS 10.3のAPFSそのままではありません。What's new in Apple File Systemを見てみることにしましょう。

一番変わったのは,Unicode Normalizationの有無。High SierraのAPFSはNormalizationを行います。本連載第26回のときの検証コードをHigh Sierra BetaのAPFSで使ってみたところ,こうなりました。

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"]

やや奇妙なことに,Perlを含めPOSIX API経由ではNFCが,Foundation経由ではNFDがそれぞれファイル名として使われていますが,\ u{304b}\ u{3070}\ u{3093}.txt"\u{304B}\u{306F}\u{3099}\u{3093}".txtが同じファイル名だと認識されています。

次回予告

というわけでSwiftを取り巻く環境の今後の方向性も見えたところで今月の記事は結びです。次回はSwift 4を見据えつつ,Swift 3でももちろん有効なSwiftyな記事をお届けする予定です。

Software Design

本誌最新号をチェック!
Software Design 2022年5月号

2022年4月18日発売
B5判/176ページ
定価1,342円
(本体1,220円+税10%)

  • 第1特集
    AWSコスト管理の極意
    コストの見える化&分析で予想外の請求を防ぐ!
  • 第2特集
    インシデント対応 実践トレーニング
    ⁠いざ⁠に備える訓練規模別対応フロー
  • 第3特集
    2年ぶりの長期サポート版
    Ubuntu 22.04 LTS⁠Jammy Jellyfish⁠最速レポート
  • 短期連載
    HashiCorp Vaultではじめるシークレット管理
    [2]動的シークレットで安全性を高めよう

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。