書いて覚えるSwift入門

第19回 SwiftとPokémon GO

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

SiriまでやってるPokémon GO

本稿が読者の皆さんに届くころにはXcode 8とSwift 3も正式リリース間近注1)⁠⁠i|mac|tv| watch)OSもバージョンが上がり,もしかしてiPhone 7と次期MacBook Proすらリリースされているかもしれません。そんな大事な時期ですが,しかしPokémon GOをスルーするわけには行かないでしょう。何しろSiriまでやってるんですから図1)⁠

図1 Pokémon GO

図1 Pokémon GO

米国版および豪国版のリリースは7月6日。前回執筆時にはすでに同国で社会現象となっていましたが,ポケモンのふるさとでもある日本での正式リリースは脱稿直後の7月22日。で,筆者もやってみると……見事にはまってしまいました。Apple Watch入手後も「わっかが1周」することなどほとんどなかった筆者が1日も欠かさずムーブゴールを達成するどころか図2)⁠1日平均10km以上歩いてます図3)⁠いったい何が起きたのでしょうか?図4

図2 ムーブゴール達成!

図2 ムーブゴール達成!

図3 ダッシュボードを見よ!

図3 ダッシュボードを見よ!

図4 レベル29(8月19日現在)

図4 レベル29(8月19日現在)


こういうのも何ですが,Pokémon GOを成立させている各要素に目新しい点はまるで見当たりません。ポケストップは開発元のNianticが2012年からやっていたIngressの援用。ポケモンにいたっては1996年,20年前リリースの「初代」の151種類そのまま。3DグラフィックスはUnityですし,サーバはGCPやAWSといった「お馴染み」のクラウドプラットフォーム。AR? セカイカメラなら2008年に始まって2013年に終了していますが,何か?

どうしてPokémon GOは先行者たちが超えられなかったキャズムを超えられたのでしょうか?

個々の要素技術が,先行者たちを超えてなかったからだというのが筆者の答えになります。ポケモン20年。スマホ10年。トレーナ,もといユーザは「やって」なくても「知って」はいたわけです。⁠新しい」のに「慣れている」⁠これって何か心当たりありませんか?

そう。Swift。型推論,オプショナル,プロトコルといったSwiftをSwiftをたらしめている要素は,どれ1つとってもほかの言語で実装されていたものばかり。しかしそれが1つにまとまると今までになかった何かになる。その結果,みんなが使うようになる……。

もう1つ似ているのは,リリース時には未完成で,今もなお未完成であること。本原稿執筆現在,ポケモンには欠かせない機能であるはずのモンスター交換はいまだに実現されていませんし,2016年のアプリとは思えないほど強制終了しまくりですし,ポケストップとジムの配置は今もなお試行錯誤が続いています。おかげで中の人はまだLv5みたいではありますが,全世界の人を歩かせるにはそれで十分だったのです。

そしてこれが一番大事だと筆者が感じているのは,細やかな報酬の重要性。人――というのが主語が大き過ぎるのであれば少なくとも筆者――は,いきなり10km歩けと言われても微動だにしないのです。しかし100mごとにポケストップがあると,いつの魔(間)にか10km歩いてしまっている。水族館のイルカやアシカのショーではショー全体が終わったあとではなく一芸ごとに餌を与えていますが,実は人というケダモノもそうなのです。大きな報酬がまとめて支払われるその日まで我慢に我慢を重ねられる人は偉大ですが,小さな人まで動いて初めて世の中は動くことを,Pokémon GOがあらためて示してくれたと感じています。

注1)
この連載は,Software Design 2016年10月号に掲載されたものです。

変わらないために変える

ポケモントレーナーの視点からあらためてSwift 3を見てみると,変わらないために変えているのだという思いを新たにします。とくに前回紹介した++--演算子やC-styleのforの廃止は,⁠Cにおもねる新言語」から「Swiftという一人前の言語」への進化だと言い切ってよいでしょう。ところでポケモンの弊害に「進化」という言葉の「誤用」があります。生物学的には同一個体の変化は「進化」ではなく「変態」なのですが,英語でもmetamorphoseではなくevolveですし,こうなるともはや誤用ではなく「語彙の進化」だと筆者も諦め気味。Xcodeでは2のコードを3に進化させられるのですが,アメ玉が不要な点はPokémon GOより優れてます:-)

API:旧弊は進化の証

その一方,一見するとなんではじめからそうしなかったという変更も多々見られます。たとえばAPIの命名規則ですが,Swift 2ではこうだったのが……,

var a = [0]
a.append(1) // [0, 1]
a.appendContentsOf([2,3]) // [0, 1, 2, 3]

Swift 3ではこうなっています。

var a = [0]
a.append(1) // [0, 1]
a.append(contentsOf:[2,3]) // [0, 1, 2, 3]

Swiftはもとから「名前が同じでもシグネチャが異なれば別の関数」なのですから,はじめからSwift 3のようにすればよかったのにと思わぬでもないですが,その一方進化前のSwiftはObjective-Cだったことを考えれば,生まれたての段階ではObjective-Cを引きずっているのも自然ではあります。余談ですが,演算子を使った記法ではSwift 2とSwift 3の違いはありません。

Swift (2|3)

var a = [0]
a += [1]
a += [2, 3]

わかりやすさも,非英語圏まで考慮すると演算子を使ったほうが直感的なような気がします。

真偽値を返すAPIは必ずisを付けるというのも同様で,Objective-Cではそうなっていなかったのですね。

Swift 2

import Foundation
var u = NSURL(fileURLWithPath: #file)
if u.fileURL {
    print(u.path!)
}

Swift 3

import Foundation
var u = NSURL(fileURLWithPath: #file)
if u.isFileURL {
    print(u.path!)
}

著者プロフィール

小飼弾(こがいだん)

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

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

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

コメント

コメントの記入