人類にはまだ早すぎるApple Watch
もはや恒例となった
筆者が最も注目したのは、


しかし、
真の全裸コンピューティングが実現するのです! 実際に露天風呂でSiriにたずねてみたら、

Wi-FiからCellularへの切り替えはとてもスムーズ。iPhoneを見失うとが表示されますが
全裸コンピューティングは人類には早すぎにしても、
電話もできますし

支払いだって問題ありません

まあ、

もちろんApple WatchがiPhoneの代わりを100%つとめるというのには無理があります。何と言っても世界で一番使われているとAppleが豪語するカメラがありませんし、

だとしたら、
次はARディスプレイ+カメラということになるでしょう。Google GlassにせよHololensにせよはたまたPS VRにせよ、
そのときの
Apple Watch Series 3で後者の可能性が見えてきました。iPhone以上に身近になりうるデバイスは今のところそれだけなのですから。
どう転んでもSwift
しかし未来がどちらに進んでも、
とはいえ、
総称型のsubscript
subscriptで総称型が扱えるようになりました。たとえばこんな書き方ができます。
struct JSON {
var value: [String:Any]
init(_ value: [String:Any]) {
self.value = value
}
subscript<T>(k: String) -> T? {
return value[k] as? T
}
}
let json = JSON([
"bool":true,
"number":42.195,
"string":"Swift",
]
)
var bool:Bool? = json["bool"]
var number:Double? = json["number"]
var string:String? = json["string"]
最終的な型はコンパイル時に決まる必要があるため、
Dictionaryのデフォルト値
Dictionary
の要素はOptional
なので、dict[key]
でkey
が存在しない場合の値はnil
ですが、dict[key, default:val]
と書くことで、nil
の代わりにval
を返すようになりました。
これは統計を取るときなどにとても便利で、
var count = [String:Int]()
for k in words {
if count[k] == nil {
count[k] = 0
} else {
count[k]! += 1
}
}
のように初期化の有無で必要だった条件分岐が、
for k in words {
count[k, default:0] += 1
}
のように不要になります。
"""
複数行"""
引用符
"""
で複数行に渡る文字列リテラルが書けるようになること自体は同記事でも軽くふれたのですが、
たとえばSwift 3でSwiftのソースコードを書くには、
let howmany = 42
let fizzBuzzSwift = [
"#!/usr/local/bin/swift",
"extension Int {",
" var fizzbuzz:String {",
" let fb = (\"Fizz\", \"Buzz\")",
" switch (self % 3, self % 5) {",
" case (0, 0) : return fb.0 + fb.1",
" case (0, _) : return fb.0",
" case (_, 0) : return fb.1",
" default : return \"\\(self)\"",
" }",
" }",
"}",
"_ = (1...\(howmany)).map{ print($0.fizzbuzz) }"
].joined(separator: "\n")
のように
let howmany = 42
let fizzBuzzSwift = """
#!/usr/local/bin/swift
extension Int {
var fizzbuzz:String {
let fb = ("Fizz", "Buzz")
switch (self % 3, self % 5) {
case (0, 0) : return fb.0 + fb.1
case (0, _) : return fb.0
case (_, 0) : return fb.1
default : return "\\(self)"
}
}
}
_ = (1...\(howmany)).map{ print($0.fizzbuzz)
}
"""
とずいぶんとスッキリ書けるようになります。もう一例として、"""
でくくられているJavaScriptを実行しています

"""
も変数展開(interpolate)する点は注意してください。この例では\(howmany)
が変数展開されていますし、\\(self)
は変数展開されないよう\
をエスケープしています。
Swift 4でもなお変数展開なしの引用符'
)
次回予告
そろそろ紙幅も尽きるので今回はここまで。次回はSwift 4で大いに整理された整数型のプロトコルをおもに取り上げます。
本誌最新号をチェック!
Software Design 2022年9月号
2022年8月18日発売
B5判/
定価1,342円
- 第1特集
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識 - 第2特集
「知りたい」 「使いたい」 「発信したい」 をかなえる
OSSソースコードリーディングのススメ - 特別企画
企業のシステムを支えるOSとエコシステムの全貌
[特別企画] Red Hat Enterprise Linux 9最新ガイド - 短期連載
今さら聞けないSSH
[前編] リモートログインとコマンドの実行 - 短期連載
MySQLで学ぶ文字コード
[最終回] 文字コードのハマりどころTips集 - 短期連載
新生「Ansible」 徹底解説
[4] Playbookの実行環境 (基礎編)