Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have 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)
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away