Swiftの勉強に、ヒレガス本こと「Max OS X Cocoa プログラミング」の例題を Swift で書いてみることにした。
手元には2009年に出た第3版しかなく、内容がちと古いかもしれないがしかたない。
とりあえず手始めに、第2章「さあ、始めましょう」で取り上げられている「乱数生成アプリケーション」を Swift で書いてみる。環境は Yosemite + XCode 6.1。
ソース:https://github.com/hugo-sb/Hillegass-ch2
書籍では Foo というクラスを作成し、そこにコードを書いていくという形だったが、今回は XCode が自動生成してくれた ViewController クラスにコードを追加していくことした。
プログラム自体は最初のプログラムということで単純なものだが、srandom()
や random()
といった C の標準関数が Swift から呼べるのか心配だった。でも実際に書いてみたらあっさり呼べたのでいささか拍子抜け(Cocoa
をインポートしてる中で読み込まれているのだろうか?)。ただ、time()
が引数に time_t*
を渡すのだが、これの書き方が判らずネットを調べることになった。
Using Swift with Cocoa and Objective-C: Interacting with C APIs
上記リンクをみると、C言語同様、変数に「&」をつけてやればアドレスを渡せるようだ。
ちなみに乱数の取得は、random()
ではなく、arc4random_uniform()
を使うのがイマドキらしいので、そちらを利用した版も追加してみた(といっても呼び出してる関数が違うだけだが)。
class ViewController: NSViewController {
@IBOutlet weak var textField: NSTextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
textField.stringValue = ""
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
@IBAction func seed(sender: AnyObject) {
var tm : time_t = 0
srandom(UInt32(time(&tm)))
textField.stringValue = "Generator seeded"
}
@IBAction func generate(sender: AnyObject) {
let generated = (random() % 100) + 1
NSLog("generated = \(generated)")
textField.integerValue = generated
}
@IBAction func generate2(sender: AnyObject) {
let generated = arc4random_uniform(100) + 1
NSLog("generated = \(generated)")
textField.integerValue = Int(generated)
}
}