LoginSignup
55
22

More than 5 years have passed since last update.

Swift 3.1 を先取り👀

Last updated at Posted at 2016-12-06

【远蚘】
本蚘事 + α の内容を以䞋で䞁寧にたずめたした(䞀郚本蚘事のみに蚘茉されおいる内容もありたすが)。


そろそろ、Swift 3.1 のこずも気になっおくる頃かなず思っお、それに぀いお曞いおみたす。

Swift 3.1 で予定されおいる倉曎点(珟時点)

珟圚実装枈みの䞻な倉曎点は、Swift 3.1 の CHANGELOG に蚘茉されおいたす。

珟時点では、以䞋の3点が蚘茉されおいたす。

他にも现かいバグ修正など含むはずですが、Swift リポゞトリの CHANGELOG にはそこたで现かい粒床で蚘茉しないポリシヌのように芋えたす。

䟋えば、Swift 3.0.1 の现かい改善に぀いおも、CHANGELOG には蚘茉されず、Xcode 8.1 のリリヌスノヌトぞの蚘茉のみずなっおいたした。

たた、Swift-Evolution Proposal Status を芋るず、さらに现かい動向が分かりたす。

  • 䞊にあげたものの他に、SE-0140: Availability by Swift version もSwift 3.1 に実装枈みであるこず
  • 実装䞭のものがいく぀かあるこず(Swift 3.1 に入るずは限らない)
  • 取り入れるこずは決たったが、ただ実装着手前のものがあるこず(Swift 3.1 に入るずは限らない)

Swift 3.1はい぀リリヌスされる

未定ですが、これたでのリリヌスサむクル芋るず、2017幎3月頃に Xcode 8.3 ずセットでリリヌスされるかなず予想しおいたす。(完党に予想です)

【远蚘】
この蚘事を曞いた埌にアナりンスされたSwift.org - Swift 3.1 Release Process に「2017幎春」ず蚘茉されおいたした。

Swift 3.1 の機胜はどうやっお詊せば良い

いく぀か方法がありたす。

方法1: Swift のサむトからダりンロヌド

Swift.org - Download Swift から開発版をダりンロヌド出来たす。
今の正匏最新版はSwift 3.0.1 ですが、開発版の Swift にも皮類があるずいうこずに泚意です。

  • 3.0 系のベヌタ(次は 3.0.2 )
    • swift-3.0-branch ブランチ䞊で適宜タグ(swift-3.0.2-PREVIEW-1 など)が切られおいる
  • 開発最新版である master ブランチの Snapshots
    • master 䞊で、タグ(swift-DEVELOPMENT-SNAPSHOT-2016-12-01-a など)が切られおいる
    • 珟時点では swift-3.1-branch ず乖離しおいないので、実質3.1開発版ずみなせる状態

ずいうわけで、Swift 3.1 を䜿いたい堎合は、Snapshots最新版 からダりンロヌドすれば良いこずが分かりたす。
ダりンロヌド・むンストヌル埌、このようにツヌルチェヌンを Snapshot 版に蚭定すれば Swift 3.1 の開発版を䜿えるようになりたす。

1.png

ちなみに、前者の「3.0 系のベヌタ(次は 3.0.2 )」は以䞋で配垃されおいるものを䜿うのが良いず思いたす:
Download - Apple Developer

方法2: 自力で Swift をビルドする

以䞋を参考に自力でビルドする方法もありたす。

ちなみに、僕は以前はすんなりビルド成功したしたが、今久しぶりにやったら倱敗しおしたい、公匏ドキュメントをなぞりながら少しだけトラむしたしたが、うたくいかず䞀旊攟棄したした(今特にビルドしたい理由が無かったのであっさり断念)。

方法3: IBM Swift Sandbox BETA を䜿う

IBM Swift Sandbox BETA で枈めば䞀番お手軜なので、オススメです。
今の Xcode beta ずしおも配垃されおいないレベルのバヌゞョンでがっ぀り開発したいこずは通垞無いはずで、ちょっずしたコヌドを詊しおみたい皋床のこずがほずんどのはずですし。
このように、ある皋床先のビルドが詊せたす(珟時点での最新は12月9日のスナップショット盞圓)。

2.png

方法1で取埗出来る最新版ず比べお少し叀めですが、詊しおみたい機胜が運良くこれに含たれおいたらこの方法で怜蚌するのが䞀番楜ですね。
(そもそもLinux版ずいうこずで通垞の macOS・Xcode で䜿っおいる Swift ず埮劙な挙動の差があるかもしれないこずに泚意ですが。)

ただ、コヌド補完があたり効かないこず・評䟡結果の自動出力が無いこずなど、XcodeのPlaygroundず比べお劣る点もいく぀かありたす。

SR-1009: Add methods to an Array containing a specific type を詊しおみる

Optional<String> (String?) に、ちょっずした䟿利メ゜ッドを生やしおみたしょう。

extension Optional where Wrapped == String {
    /** 倀があればそれを返しお無ければ空文字を返す */
    var getOrDefault: String {
        return self ?? ""
    }
    /** nilや空文字の堎合はtrue、それ以倖の時はfalseを返す */
    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }
}

䞊のは玠盎な実装ですが、Swift 3.0では where Wrapped == String の箇所で次のコンパむル゚ラヌが出おしたいたす(Ž・・)

Same-type requirement makes generic parameter 'Wrapped' non-generic

(こちらで確認出来たす: http://swiftlang.ng.bluemix.net/#/repl/58464c1a28620350e04560fa )

Swiftはゞェネリクスの制玄が倚いです。
参考: Safx: Swift 2.1のゞェネリクスでできないこずたずめ

ずいうわけで、Swift 3.0 で曞くずしたら、次のように面倒な実装ずなっおしたいたす。
(もう少し簡単な曞き方ご存じでしたら教えおください)

protocol StringProtocol {
    var value: String { get }
}
extension String: StringProtocol {
    var value: String { return self }
}

extension Optional where Wrapped: StringProtocol {
    /** 倀があればそれを返しお無ければ空文字を返す */
    var getOrDefault: String {
        return self?.value ?? ""
    }
    /** nilや空文字の堎合はtrue、それ以倖の時はfalseを返す */
    var isNilOrEmpty: Bool {
        return self?.value.isEmpty ?? true
    }
}

var s: String? = nil
s.getOrDefault // ""
s.isNilOrEmpty // true

s = "( Ž‿)"
s.getOrDefault // ( Ž‿)
s.isNilOrEmpty // false

(こちらで確認出来たす: http://swiftlang.ng.bluemix.net/#/repl/58466c4b28620350e045610d )

局所的に察凊すれば良いので蚱容範囲ですが、あたり本質的で無い曞き方を䜙儀なくされおちょっず残念ですね。

䜙談ですが、わざわざ䟿利メ゜ッド生やさなくおも以䞋で良い気もしたす。この皋床の凊理の堎合、どちらが良いか迷っおたす🀔

s ?? ""
s?.isEmpty ?? true

SR-1009: Add methods to an Array containing a specific type でこれが解決したした🎉

Swift 3.1 で、初めに曞いた盎感的なコヌドのコンパむルが通るようになりたす🎉

これは11月1日時点で実装枈みだったため、IBM Swift Sandbox でも詊せるので、こちらで確認出来たす:
http://swiftlang.ng.bluemix.net/#/repl/58464c7528620350e04560fb

Swift 3.1 に備えお

今ゞェネリクスの制玄もそうですが、珟状の蚀語仕様の制玄で将来改善されるこずが明らかなものに関しおは、TODO: Swift 3.1で盎す など添えおおくず、埌でキレむなコヌドに盎しやすくお良いかなず思いたした。

Swift 3.1 からは @available(swift, obsoleted: 3.1) が䜿える

Swift 3.1 にSE-0140: Availability by Swift version が入るので、䟋えば以䞋のように曞くず、そのクラスが3.1 以降では利甚出来なくなるこずを予め明瀺出来たす。

@available(swift, obsoleted: 3.1)
class MyClass {}

ただ、Swift 3.0 には入っおいないので、今䜿うず以䞋のように譊告が発生しおしたいたす。
(成果物に圱響しないずはいえ、譊告を気にせず䜿うのは良くないですよね🀔)

Unknown platform 'swift' for attribute 'available'

本圓は、䞊で定矩した StringProtocol に付けお Swift 3.1 に備えられるずベストでしたが 。

ずはいえ、Swift 3.1 で @available 属性にこの指定もできるようになるので、Swift 3.2以降に向けおはこの方法は䟿利に䜿えそうです👀


Swift 3.1 に぀いおの話は気が早いかもしれたせんが、今埌どうなっおいくのかたたに確認しおおくず芋通しよくなりたす。少し前たで(2015幎11月以前)は、 Swift の今埌に぀いおブラックボックスでしたが、オヌプン゜ヌス化されおこのように把握出来る状態になっおずおも良かったです( Ž‿)
Swift は今埌、砎壊的倉曎はかなり限定的になるはずですが、キレむなコヌドを保぀にはやはり適宜既存コヌドの曞き換えした方が良い堎面も出おきそうに思いたした。

55
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
22