計画していた通り、最近発表されたSwift 3.1には、Swift 3.0とソースレベルの互換性がある。だが、言語、標準ライブラリ、Linux実装には多数の変更と改善が含まれている。
言語フロントにおいては、Sequence
プロトコルに2つの新しいメンバ(drop(while:)
とprefix(while:)
)が追加された。これらは与えられた述部が真である間、もとのシーケンスの要素をドロップもしくはインクルードしていき、得られたサブシーケンスを返す。したがって、シーケンスs
がある場合に以下を実行することで、nからmまでのサブシーケンスを取り出せる。
let subseq = s.prefix(while: {$0 < m}).drop(while: {$0 < n})
Swift 3.1には、Int
、Float
、Double
型を含むすべての数値型に変換イニシャライザが追加された。これは正しい結果を生成するか、さもなくばnil
を返すようになっている。Failableイニシャライザを呼び出すことで、、JSON形式のような緩く型付けされたデータの変換をより適切に扱うことができる。すべての数値型は、exactly
キーワードを使った新しいイニシャライザを持つようになる。
init?(exactly value: Int64)
コミュニティからのフィードバックによると、例外を投げる可能性のあるイニシャライザよりも、失敗する可能性のあるイニシャライザの方が好まれているようだ。
また、公式発表では触れられていないが、Swift 3.1にアップデートされたAppleのガイドには、型の拡張にジェネリックなwhere
節を入れることができると書かれている。
extension Container where Item == Double {
func average() -> Double {
var sum = 0.0
for index in 0..<count {
sum += self[index]
}
return sum / Double(count)
}
}
where
節はこれまで、指定したプロトコルに対してジェネリックスを制約するためにしか使えなかった。このことは、制約を指定するためだけにアドホックなプロトコルを導入することを引き起こしていた。
extension Container where Item: MyConstrainProtocol {
...
言語に関するものの最後として、Swift 3.1では@available
属性が拡張された。これまでは言語とプラットフォームしか指定できなかったが、Swiftバージョンによって利用可能かどうかを指定できるようになった。
@available(swift, introduced: 3.0, obsoleted: 3.1)
class Foo {
//...
}
プログラマはこれによって、関数や宣言などで代替バージョンを扱うための条件付きコンパイルから解放される。
SwiftのLinux実装に関しては、NSDecimal
、URLSession
、NSArray
、NSData
JSONシリアライゼーション性能の改善など、既存のクラスの多くが改善されている。
最後に、Swift Package Managerには、次のような待ち望まれていた機能が追加されている。
- パッケージが編集可能に。
swift package edit
コマンドを使ってパッケージを編集できるようになる。これは、パッケージをユーザーのPackage
ディレクトリに移して、依存関係の更新を回避できることを意味している。ユーザーはそのパッケージに対して、自由にコミット、プッシュできるようになる。 - バージョン固定。
swift package pin
とswift package unpin
コマンドを使う、もしくはPackage.pins
ファイルを編集することによって、バージョンを固定することができる。 - バージョン要求。古いツールチェーンを使っているクライアントを壊すことなく、Swiftの機能を導入することができる。古いツールチェーンでパッケージをアップデートした場合、新しい機能を必要とするパッケージのバージョンは自動的に無視される。
- Swift互換バージョン。これまでのものと似ているが、パッケージのために使われる言語バージョン、3もしくは4。
Swift 3.1は、macOS上ではXcode 8.3を通して利用できる。Ubuntu用にはバイナリが配布されており、それ以外のプラットフォームにはGitHubにあるソースコードが利用できる。
Rate this Article
- Editor Review
- Chief Editor Action