書いて覚えるSwift入門

第18回 APFSとSwift3

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

swift.version++ // 廃止される機能

それではいよいよSwift 3の紹介を。といっても,実はSwift 2.2をお使いの皆さんはすでに触れているといっても過言ではありません。Swift 3で廃止が予定されている機能に関しては,すでに警告が出るからです。Swift 3へすぐに移行せずにとりあえずSwift 2.3にとどまるにしろ,警告は今のうちに消しておきましょう。

++ / --

おそらく一番知られているのは[SE-0004]。ほとんどのケースで,+= 1とするだけで対処できるでしょう。どうしても欲しかったら,あらためてオレ演算子として定義してしまえば良いのです。Swift 3でも警告なしで使えます。

prefix func ++(i: inout Int) -> Int {
    i += 1
    return i
}

postfix func ++(i: inout Int) -> Int {
    let o = i
    i += 1
    return o
}

C-Styleのfor

[SE-0007]SequenceTypeあらためSequenceプロトコルがあるSwiftではほとんど不要でしょう。

for var i = 0; i < 10; i++ {
  let elem = array[i]
  // …
}

より,

for elem in array {
  // …
}

のほうがはるかにわかりやすいですし,iも欲しければ,

for (i, elem) in array.enumerate() {
  // …
}

とするだけです。

パラメータvar

[SE-0003]のパラメーター中のvar禁止とはどういうことかというと,こういうコードが書けなくなるということです。

Swift2

func gcd(var a: Int, var _ b: Int) -> Int {
    a = abs(a); b = abs(b)
    if (b > a) { (a, b) = (b, a) }
    while (b > 0) { (a, b) = (b, a % b) }
    return a
}

varしたかったら,ブロック内であらためてやれ,と。

Swift(2¦3)

func gcd(a: Int, _ b: Int) -> Int {
    var (x, y) = (abs(a), abs(b))
    if (x > y) { (x, y) = (y, x) }
    while (y > 0) { (x, y) = (y, x % y) }
    return x
}

カリー化構文

「インド人は右へ」ではなくて,[SE-0002]は次のようなコードが書けなくなるということです。

Swift2

func logWithBase(b:Double)(_ x:Double)-
>Double {
    return log(x)/log(b)
}

let log2 = logWithBase(2)
print(log2(8)) // 3.0

Swiftにはブロックがあるので,こう書けばOKですし,そのほうがわかりやすいでしょう。

Swift(2¦3)

func log(base b:Double)->(Double)->Double {
    return { x in log(x)/log(b) }
}

let log2 = log(base:2)
print(log2(8)) // 3.0

実際のところ,カリー化構文を――とくにプロダクションコードで――使っている方は少ないかと思われますが念のため。

パラメータのタプル渡し

ほとんど知られていなかった機能ですが,Swift 2では次のコードがOKでした。

Swift2

func distance(_ x:Double, _ y:Double)-
>Double {
  return sqrt(x*x + y*y)
}
let p = (3.0, 4.0)
print(distance(p)) // 5.0

パラメータ全体をタプルにして,そのタプルを1つ渡すとすべてのパラメータを渡したのと同等で,言語的には一貫してはいるのですが,バグを引き寄せやすい機能ということで,[SE-0029]で廃止されることになりました。

Swift(2¦3)

func distance(_ x:Double, _ y:Double)-
>Double {
  return sqrt(x*x + y*y)
}
let p = (3.0, 4.0)
print(distance(p.0, p.1)) // 5.0

次回に向けての予習

というわけでSwift 3で廃止される機能の紹介だけで今号の誌面が尽きてしまったようですが,オープンソース化されたおかげで,Swift 3の変更はGitHubのswift-evolutionでも事前に確認できます。さらにうれしいことに,すでに実装済みの機能に関しては,IBM Swift Sandboxで実際に動かしてみることもできます図1,図2)⁠

図1 IBM Swift Sandboxでの実行例(コード編集)

図1 IBM Swift Sandboxでの実行例(コード編集)

図2 IBM Swift Sandboxでの実行例(複数バージョンのSwiftを指定)

図2 IBM Swift Sandboxでの実行例(複数バージョンのSwiftを指定)

パソコンはもちろん,スマートフォンからでも。Swiftのバージョンを切り替えて試せる点も素晴らしい。

というわけで,次回はいよいよSwift 3の核心に迫っていく予定です。

Software Design

本誌最新号をチェック!
Software Design 2019年7月号

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

  • 第1特集
    ⁠速い⁠Webアプリケーションの作り方[バックエンド編]
    ボトルネックの見つけ方,キャッシュ・CDNの活用
  • 第2特集
    IT業界ビギナーのためのDocker+k8s入門講座[Kubernetes編]
    図解で深く理解して最先端にキャッチアップ!
  • 特別企画
    完全マネージ型のメリットを堪能する
    Amazon SageMaker入門
  • 特別企画
    クラウドへのルータ接続実践ノウハウ
    【2】AWSとヤマハルータをつなぐ
  • 一般記事
    「WebAuthn」が導く新時代のパスワードレス認証
    【後編】WebAuthnを利用したFIDO導入のための考え方
  • 短期連載
    Mattermost[導入+構築]入門
    【最終回】ご存じですか? chat導入のメリット

著者プロフィール

小飼弾(こがいだん)

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

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

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