書いて覚えるSwift入門

第33回 ゆくXくるX

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

Swift 4.1

前置きはこれくらいにして,本題に。Xcode 9とともにSwift 4が来たと思いきや,Swift 4.1の足音がすでに聞こえてきています。Swift 4.0とソースコード互換ではありますが,バイナリ互換ではない点は注意を要します。

正式リリースは来年前半とのことですが,すでにバイナリースナップショットが公式サイトより配布されており,それを使って変更点および新機能を検証できるようになっております。本記事では Ubuntu 16.04用のスナップショットで検証を行いました。

[SE-0157]:再帰的なプロトコル制約

Swift 4.1の一番の目玉はこれでしょう。プロトコル中のassociatedtypeの制約に,それ自身が使えるようになりますリスト1)⁠

リスト1 associatedtypeの利用方法の変更

protocol Sequence {
    associatedtype Element
    associatedtype SubSequence: Sequence
      where SubSequence.Element == Element,
            SubSequence.SubSequence == SubSequence
    // ...
}

protocol Collection: Sequence
    where Self.SubSequence: Collection {
    // ...
  }

筆者から見てSwiftの一番の欠点は,再帰型でした。たとえばSwift 1では,

enum List<T> { // Swift 2 or better
    case Nil
    indirect case Cons(T, List<T>)
}

のように,自分自身と同じ型のプロパティを内包した型さえ作れなかったのです。この状況はSwift 2で大きく前進したのですが,あくまで再帰的な型を作れるのは実体型であり,プロトコルで同様なことはできませんでした。

ご覧のとおり実例としてSwiftで欠かすことのできないSequenceSubSequenceが挙げられており(リスト1)⁠これもたバイナリ非互換の一因かと思われますが,これらのプロトコルは今までどおり使えるのでソース互換は保たれていると認識しています。

[SE-0186]:プロトコル中におけるweakおよびunowned指定の禁止

メモリ管理をどうするかは実体型の問題であってプロトコルの問題ではなかったはずですが,Swift 4時点でリスト2のコードは問題なく動いていました。

リスト2 バージョンアップで動かなくなると予想されるコード

class A {}

protocol P {
    weak var weakVar: A? { get set }
    unowned var unownedVar: A { get set }
}

Swift 4.1以降は警告が発せられ,Swift 5からはエラーになります。

[SE-0185]:==および.hashValueの自動生成

リスト3で,Swift 4.1ではストアドプロパティがすべてEquatableの場合には==演算子が,Hashableの場合には加えて.hashValueが自動で定義されるようになります図4)⁠

リスト3 .hashValueの自動生成

struct Point<T:Hashable>: Hashable {
    let x: T
    let y: T
    init(_ x: T, _ y: T) {
        self.x = x
        self.y = y
    }
}

図4 実行結果

Point(3, 0) == Point(0, 3) // false
Point(3, 0) == Point(3, 0) // true
Point(3, 0).hashValue // -2942920663782199421

Protocol Extensionの導入により自動生成される演算子やメソッドやプロパティは格段に増えたのですが,この2つがまだ自動生成の対象になっていなかったのはよく考えてみると意外です。==はストアドプロパティがすべて==のときだけtrueで,hashValueはストアドプロパティの.hashValueを合成すれば生成できるというのはいわば自明だからです。

もちろんこれまでどおり手動で定義されたものはそちらが優先されるので,4.1が正式リリースされたら==.hashValueは削除してしまうのも一考かもしれません。==はとにかく.hashValueで適切なハッシュ関数を定義するのは案外難易度高いので。

次回予告

前半で昨今のプログラミング環境の敷居の高さをぼやきつつ,後半でプログラミング言語の詳細を紹介するというのは我ながら本末転倒感がありますが,次回はもう少しカジュアルに行く予定です。

Software Design

本誌最新号をチェック!
Software Design 2018年6月号

2018年5月18日発売
B5判/192ページ
定価(本体1,220円+税)

  • 第1特集
    Webサービス開発 5つの心得
    流行りの技術や手法を学ぶのにはワケがある
  • 第2特集
    CDN[超]活用ガイド
    高速配信の舞台裏
  • 一般記事
    [短期連載]PHPで学ぶコンピュータアーキテクチャ
    【1】CPUのエミュレーション
  • 一般記事
    [短期連載]実践! GPUサーバでディープラーニング
    【4】GPUサーバで作るミニ囲碁プログラム(後編)
  • 一般記事
    春からのプログラミングのおともに
    開発が楽しくなるEmacsの始め方

著者プロフィール

小飼弾(こがいだん)

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

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

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

コメント

コメントの記入