秋の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
という具合で原稿を書く暇はどこにあるのでしょうか😂。
![図1 Special Event 図1 Special Event](/assets/images/dev/serial/01/swift-introduction/0042/thumb/TH800_001.png)
今回はその9月をおさらいしつつ、
高イフォン、永イフォン
昨年のiPhone Xで、
![図2 Apple製品の平均価格 図2 Apple製品の平均価格](/assets/images/dev/serial/01/swift-introduction/0042/thumb/TH800_002.png)
そしてその理由は、
![図3 Apple製品の出荷台数 図3 Apple製品の出荷台数](/assets/images/dev/serial/01/swift-introduction/0042/thumb/TH800_003.png)
そう。4年前から頭打ちなのです。iPhoneだけではありません。スマートフォン全体の売り上げ台数が。人々がスマホに飽きたわけではありません。オンにもオフにも、
しかしスマホ以前のガラケーはもっと売れていたのです。最盛期のNokiaは1年ではなく1四半期に1億台以上の端末を売りました。しかし人々はガラケーを捨てスマホを求めました。そうさせるだけの魅力がスマホにあったから。だとしたら今のスマホを捨てさせるだけの魅力を持った新製品を出せ、 しかし、 これは陳腐化が前提のデジタルデバイス業界の自己否定にすら思えます。しかし他のハードウェア業界では常識です。乗用車を毎年買い換える人は稀ですし、 しかし乗用車と決定的に異なる点が1つあります。スマホはソフトウェアで若返らせることができるのです。いみじくもiOS 12がそれを証明しました。五年前のiPhone 5sもはっきり体感できるほど速くなったのですから。しかしそのためには最新のソフトウェアを受け止められるだけの余裕を持ったハードウェアが必要で、 そう、 そのSwiftは、 ただし、 公式の は陳腐化しました。今後はなるべく とするとよいでしょう。 とくに変わったのが、 Swift 4. ほかにも変更点はいくつかありますが、 次回は、 2022年8月18日発売
LinuxでもFoundation!
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
#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月号
B5判/
定価1,342円
MySQL アプリ開発者の必修5科目
不意なトラブルに困らないためのRDB基礎知識
OSSソースコードリーディングのススメ
企業のシステムを支えるOSとエコシステムの全貌
今さら聞けないSSH
MySQLで学ぶ文字コード
新生