More than 1 year has passed since last update.

Swiftの勉強に、ヒレガス本こと「Max OS X Cocoa プログラミング」の例題を Swift で書いてみることにした。
手元には2009年に出た第3版しかなく、内容がちと古いかもしれないがしかたない。

とりあえず手始めに、第2章「さあ、始めましょう」で取り上げられている「乱数生成アプリケーション」を Swift で書いてみる。環境は Yosemite + XCode 6.1。

ソース:https://github.com/hugo-sb/Hillegass-ch2

スクリーンショット 2014-10-27 23.58.31.png

書籍では 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() を使うのがイマドキらしいので、そちらを利用した版も追加してみた(といっても呼び出してる関数が違うだけだが)。

ViewController.swift
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)
    }
}
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.