秋のiPhone祭り
本稿執筆現在は9月、
- 9月14日:Special Event
- 9月18日:iOS 12 & watchOS 5
- 9月21日:iPhone XS、
Apple Watch Series 4 and Xcode 10 - 9月25日:macOS Mojave
という具合で原稿を書く暇はどこにあるのでしょうか😂。

今回はその9月をおさらいしつつ、
高イフォン、永イフォン
昨年のiPhone Xで、

そしてその理由は、

そう。4年前から頭打ちなのです。iPhoneだけではありません。スマートフォン全体の売り上げ台数が。人々がスマホに飽きたわけではありません。オンにもオフにも、
しかしスマホ以前のガラケーはもっと売れていたのです。最盛期のNokiaは1年ではなく1四半期に1億台以上の端末を売りました。しかし人々はガラケーを捨てスマホを求めました。そうさせるだけの魅力がスマホにあったから。だとしたら今のスマホを捨てさせるだけの魅力を持った新製品を出せ、
しかし、

これは陳腐化が前提のデジタルデバイス業界の自己否定にすら思えます。しかし他のハードウェア業界では常識です。乗用車を毎年買い換える人は稀ですし、
しかし乗用車と決定的に異なる点が1つあります。スマホはソフトウェアで若返らせることができるのです。いみじくもiOS 12がそれを証明しました。五年前のiPhone 5sもはっきり体感できるほど速くなったのですから。しかしそのためには最新のソフトウェアを受け止められるだけの余裕を持ったハードウェアが必要で、
そう、
LinuxでもFoundation!
そのSwiftは、import Foundation
できるようになって、#if os()
なしにクロスプラットフォームで動くコードが格段に書きやすくなっています。
ただし、import Foundation
しようとすると、
Welcome to Swift version 4.2 (swift-4.2-RELEASE). Type :help for assistance. 1> import Foundation error: Couldn't lookup symbols: _swift_FORCE_LOAD_$_swiftGlibc
公式のclang
とlibicu-dev
に加えて、libcurl4
をインストールしておく必要があります。次はUbuntu 18.
$ sudo apt-get install clang libicu-dev libcurl4 $ wget https://swift.org/builds/swift-4.2- release/ubuntu1804/swift-4.2-RELEASE/swift-4.2-RELEASE-ubuntu18.04.tar.gz $ tar xvpf swift-4.2-RELEASE-ubuntu18.04.tar.gz $ export PATH=̃/swift-4.2-RELEASE-ubuntu18.04/usr/bin:$PATH
Foundation
が使えるようになったことで以前の、
#if os(iOS) || os(watchOS) || os(tvOS)
import Darwin
// ...
#else
import Glibc
// ...
#endif
は陳腐化しました。今後はなるべくFoundation
を共通で使うようにして、
#if canImport(Darwin)
// Appleプラットフォーム
#else
// Linux、FreeBSD…
#endif
とするとよいでしょう。
.hashValue -> .hash(into:)
Hashable
プロトコルの必須プロパティが、.hashValue:Int
から.hash(into:)
に変わったことも特記すべきでしょう。これは解説よりも実例を見たほうがわかりやすと思います。swift-sionでは次のように変更しています。
extension SION : Hashable {
public var hashValue: Int {
switch self {
case .Error(let m): fatalError("\(m)")
case .Nil: return NSNull().hashValue
case .Bool(let v): return v.hashValue
case .Int(let v): return v.hashValue
case .Double(let v): return v.hashValue
case .Date(let v): return v.hashValue
case .String(let v): return v.hashValue
case .Data(let v): return v.hashValue
case .Ext(let v): return v.hashValue
case .Array(let v): return "\(v)".hashValue // will be fixed in Swift 4.2
case .Dictionary(let v): return "\(v)".hashValue // will be fixed in Swift 4.2
}
}
}
extension SION : Hashable {
public func hash(into hasher: inout Hasher) {
switch self {
case .Error(let m): fatalError("\(m)")
case .Nil: NSNull().hash(into:&hasher)
case .Bool(let v): v.hash(into:&hasher)
case .Int(let v): v.hash(into:&hasher)
case .Double(let v): v.hash(into:&hasher)
case .Date(let v): v.hash(into:&hasher)
case .String(let v): v.hash(into:&hasher)
case .Data(let v): v.hash(into:&hasher)
case .Ext(let v): v.hash(into:&hasher)
case .Array(let a): for e in a {
e.hash(into:&hasher)
}
case .Dictionary(let d):for k in d.keys.sorted(by:{$0.hashValue
とくに変わったのが、Array
とDictionary
の場合。以前は全部文字列化してその.hashValue
をとっていたのに対し、.hash()
しています。ここで注目して欲しいのがDictionary
の場合。なぜキーをソートしているかと言えば、Dictionary
は順不同だから。["one":1,"zero":0] == ["zero":0,"one":1]
ですが、["one":1,"zero":0]
と辞書順にソートされてから文字列化されますが、SION
の.description
が明示的にそうしているからであって、Dictionary
一般で成り立つとは言えません。
equally random
Swift 4.
#if os(iOS) os(tvOS) os(watchOS) ||
os(macOS)
return Int(arc4random())
#else
return random() // or Int(rand())
#endif
let randomIntFrom0To10 = Int.random(in: 0 ..
ほかにも変更点はいくつかありますが、Edit
以下のConvert
メニューである程度自動変更もしてくれます

次回予告
次回は、
本誌最新号をチェック!
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の実行環境 (基礎編)