トップ 最新 追記

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|

2017-02-03 [macOS]継承vs使用

最新の環境でCocoaプログラミングを復習していると、思わぬ発見がある。

クラスの継承を選択するのはCococaプログラミングの初心者が陥りやすい罠で、熟練者は使用を選択する。

C++のような強い型付けの言語では、継承は必要不可欠だが、Objective-Cのような弱い型付け言語では、継承はタイプング量を減らすための、その場しのぎだそうだ。この考えは、InterfaceBuilderでも感じられる。

Swiftは強い型付け限度だが、それによって、大量の間違った継承の選択による問題発生を危惧したのか、Structの利用を推奨し、プロトコル指向を勧めているみたい。

ただ、Struct好きおじさんによる、間違ったStructの選択による悲劇が耳に入ってきているので、何事もほどほどが一番のようだ。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/lottery - GitHub

_ 関連情報

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

2017-02-05 [macOS]クラスを作成する

前回のコマンドライン・プログラムをクラスを使うように書き換えた。

作成したクラスは以下のとおり。

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フレームワークを利用している。

_ ソースコード

GitHubからどうぞ。
https://github.com/murakami/workbook/tree/master/mac/lottery - GitHub

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)