iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
最新の環境でCocoaプログラミングを復習していると、思わぬ発見がある。
クラスの継承を選択するのはCococaプログラミングの初心者が陥りやすい罠で、熟練者は使用を選択する。
C++のような強い型付けの言語では、継承は必要不可欠だが、Objective-Cのような弱い型付け言語では、継承はタイプング量を減らすための、その場しのぎだそうだ。この考えは、InterfaceBuilderでも感じられる。
Swiftは強い型付け限度だが、それによって、大量の間違った継承の選択による問題発生を危惧したのか、Structの利用を推奨し、プロトコル指向を勧めているみたい。
ただ、Struct好きおじさんによる、間違ったStructの選択による悲劇が耳に入ってきているので、何事もほどほどが一番のようだ。
_ 関連情報
前回のコマンドライン・プログラムをクラスを使うように書き換えた。
作成したクラスは以下のとおり。
import Foundation
import GameplayKit
class LotteryEntry {
var entryDate: Date
private var _firstNumber: Int
var firstNumber: Int {
return _firstNumber
}
private var _secondNumber: Int
var secondNumber: Int {
return _secondNumber
}
init() {
self.entryDate = Date()
self._firstNumber = 0
self._secondNumber = 0
}
deinit {
print("Destroying \(self)")
}
func description() -> String {
let dateFormatter = DateFormatter()
dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP") as Locale!
dateFormatter.timeStyle = .short
dateFormatter.dateStyle = .short
let date = dateFormatter.string(from: entryDate)
return "\(date) = \(firstNumber) and \(secondNumber)"
}
func setNumbersRandomly() {
self._firstNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
self._secondNumber = GKRandomSource.sharedRandom().nextInt(upperBound: 99) + 1
}
}
主関数は以下のように変更した。
import Foundation
var array = [LotteryEntry]()
for i in 0..<10 {
/*
let number = i * 3
array.append(number)
*/
var entry = LotteryEntry()
entry.setNumbersRandomly()
entry.entryDate = Date(timeIntervalSinceNow: (60.0 * 60.0 * 24.0 * 7.0 * Double(i)))
array.append(entry)
}
print(array)
for entry in array {
print(entry.description())
}
exit(EXIT_SUCCESS)
新規作成したクラスLotteryEntryは、ヒレガス本ではNSObjectを継承したクラスだったが、Swiftなので何も継承しないクラスとした。そこで、後で気がついたのだが、クラスの内容をダンプするために、description()関数を追加したのだが、これは、NSObjectの場合だったようだ。
ヒレガス本では、NSCalendarDateが使われていたが、これは廃止されたクラスなので、Dateクラスを利用している。
乱数の生成は、GameplayKitフレームワークを利用している。