LoginSignup
32
30

More than 5 years have passed since last update.

ヒレガス本の例題を Swift で書いてみる(1)

Posted at

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)
    }
}
32
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
30