BT

Your opinion matters! あなたのご意見でInfoQが変わる!

Swift 4が正式公開 - その最新情報

| 作者: Sergio De Simone フォローする 6 人のフォロワー , 翻訳者 h_yoshida フォローする 0 人のフォロワー 投稿日 2017年10月30日. 推定読書時間: 6 分 |

あなたのリクエストに応じて、ノイズを減らす機能を開発しました。大切な情報を見逃さないよう、お気に入りのトピックを選択して、メールとウェブで通知をもらいましょう。

原文(投稿日:2017/09/20)へのリンク

Swiftの最新のメジャーリリースには、言語とライブラリに多数の変更とアップデートが含まれている。特に注目すべきは新しいString機能、拡張されたコレクション、アーカイブとシリアライゼーションなどだ。

Swift 4の文字列はCollectionプロトコルに準拠しているため、直接イテレーションが可能であるだけでなく、次の例のように、コレクションやシーケンスで使用するすべての機能が提供されている。

for c in myString {
  print(c)
}
myString.filter { c in
  return boolCheck(c)
}
let l = myString.count
let myString2 = myString.dropFirst()

さらに、文字列のスライスがSubstring型のインスタンスになったことで、StringProtocolに対応すると同時に、String型と同等に使用できるようになった。この変更は、Substringが文字列スライスをコピーしなくなることによって、スライス処理のパフォーマンスの向上にも寄与する。SubstringStringに変換されてAPIで使用されるまで、コピー処理を遅延させることが可能になるのだ。

その他の新しい文字列機能としては、Unicode 9と複数行リテラルのサポートがある。

Swift 4では、DictionarySetなど、コレクション型の生成、使用、管理の方法も改善されている。

まず最初に、タプルのシーケンスからのDictionaryの生成と、Dictionaryの生成あるいは2つのDictionaryのマージ時に重複のあった場合の処理方法を指定することが可能になった。

let items = ["ItemA", "ItemB", "ItemC", "ItemA"]
let prices = [14.40, 41.63, 3.71, 15.63]
let catalog1 = Dictionary(uniqueKeysWithValues: zip(items, prices))
let catalog2 = Dictionary(prices, uniquingKeysWith: { (l, r) in
    l })
let catalog3 = Dictionary(prices, uniquingKeysWith: { (l, r) in
    l + r })
let merged = catalog.merge(catalog3) { (l, r) in r }

DictionarySetArray以外に、同じ型の別オブジェクトにもフィルタリングできるようになった。さらにDictionaryでは、mapValuesメソッドもサポートされている。

let catalog4 = catalog.filter { $0.value < 15.0 }
let catalog5 = catalog.mapValues { $0 * 1.2 }

Dictionaryに追加されたもうひとつの便利な機能は、要素をアクセスする時のデフォルト値を指定できるようになったことだ。これを使って、添字演算子で非opt型を返すことが可能になる。

let price1 : Float = catalog['none', default: 0.0]
let price2 : Float? = catalog['none']

Swift 4では、すべてのCollection型がジェネリックな添字をサポートする。これはつまり、次のようなJSON構造体を定義して、インデックスされた結果をDictionaryにキャストしないことが可能である、ということだ。

struct JSON {

    init(dictionary: [String:Any]) {
    ...
    }
    subscript<T>(key: String) -> T? {
    ...
    }
}

let json = ...
let result: String? = json['item']

もうひとつの歓迎される言語拡張は、アーカイブとシリアライゼーションのサポートだ。これまではNSObjectNSCodingで扱う必要があった上に、structenum型では使用できなかった。その代わりにSwift 4では、Codableプロトコル通じて、すべての型のシリアライゼーションが加えられている。Ole Begemann氏が、Swift 4でのコーディングとデコーディングに関して、素晴らしいイントロダクションを提供してくれている。例えば下記は、Codable型の定義方法を示している。

struct Card: Codable, Equatable {
    enum Suit: String, Codable {
        case clubs, spades, hearts, diamonds
    }

    enum Rank: Int, Codable {
        case two = 2, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
    }

    var suit: Suit
    var rank: Rank

    static func ==(lhs: Card, rhs: Card) -> Bool {
        return lhs.suit == rhs.suit && lhs.rank == rhs.rank
    }
}
let hand = [Card(suit: .clubs, rank: .ace), Card(suit: .hearts, rank: .queen)]

最後の注意点として、Swift 4には2つの言語モードがあり、-swift-versionコンパイルオプションで選択するようになっている。Swift 3.2モードでは、Swift 3.xコンパイラに対応するソースの大半が受け入れられる。このモードでもSwift 4言語機能は利用可能だが、既存APIのアップデート部分は利用できない。Swift 4.0モードでは、ある程度のソース変更を行なうことで、Swift 4の全機能にアクセスできる。必要となる変更は、通常はXcodeのマイグレーションアシスタントを使って処理可能だ。

Swift 4には他にもいろいろある。SwiftのメンテナであるTed Kremenek氏の発表と、Ole Begemann氏によるインタラクティブなPlaygroundでの新機能すべてのデモを見逃してはならない。

Swift 4はXcode 9に同梱されている他、Xcode 8.3に手動でインストールすることもできる。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT