ラベル Swift の投稿を表示しています。 すべての投稿を表示
ラベル Swift の投稿を表示しています。 すべての投稿を表示

2014-06-12

Swiftカンフー #002 標準入力から文字列をもらう

プログラミング言語を覚えるには「実際に役に立つプログラムを作ってみるのが一番」というわけで、翻訳作業で役に立つプログラムを作成してみることにしました。

私が自作するプログラムの多くは「フィルタ」です。ファイル(あるいはキーボード)から文字列を読み込んで、何かを処理して出力する。

標準入力(stdin)から文字列をもらう

フィルタを作るには標準入力からの読み込みができないとなりません。C言語のscanf()とか、C++のcinとかみたいに。

Google大明神にお願いすること数度、何とかできました。出典はstackoverflowです。

// example-01-stdin.swift
import Foundation  // Objective-CのNSFileHandleなどが使えるようになる

func データ読み込み() -> String {
  var 標準入力用ファイルハンドル = NSFileHandle.fileHandleWithStandardInput()
  var 生データ = 標準入力用ファイルハンドル.availableData
  var 文字列データ = NSString(data: 生データ, encoding:NSUTF8StringEncoding)
  return 文字列データ
}

func 何か処理(入力文字列: String) -> String {
  return 入力文字列 + 入力文字列 // 2度繰り返す
}

var 読み込んだ文字列 = データ読み込み()
while 読み込んだ文字列 != "" {
  let 処理後の文字列 = 何か処理(読み込んだ文字列) // ここで処理
  print(処理後の文字列)
  読み込んだ文字列 = データ読み込み()
}

2014-06-11

Swiftカンフー #001 関数から複数の値が戻ってきたときの処理

もうじきiOSの本を出版するので、Swiftは避けて通ることができません。

というか、なかなか悪くない言語かなと思っています。

GoogleのDartも悪くないと思ったのですが、やっぱりそう簡単には広まりません。だいいち実行速度が遅すぎるし...。 しかしAppleがiOSやMac用に採用したとなると、強制的に広まることになります。

というわけで、Swiftのお勉強を始めることにしました。

関数は複数の値を返せる

Swiftの関数は複数の値を返せます。たとえば次のように定義します。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

しかし、日本語が変数名や関数名に使えるというのはメチャわかりやすいですね。ふ〜む。変数とテキストの区別がつかなくなるかと心配していたのですが、それは杞憂のような気もします。もっとも、英語ネイティブな人々はいつもこんな風に書いているわけですからね。かえって、funcとかIntとかreturnとか、キーワードが目立ってわかりやすいかもしれませんね。

複数の値をもらうには?

関数から複数の値が返ってくるのは、はっきり言って便利です。 ポインタとか使わなくていいですし、明確です。 JavaScriptでもオブジェクトを返せば複数の値を簡単に返せますが、私はすぐに気がつかなかったです。それに対して、こう明確になっていると明確。もっともPHPは返せましたよね(色々やっていると混乱する...)。

さて、「返ってきた複数の値をどう処理したらいいんだろう?」と思ったら、タプル(tuple)というのを使えばいいのです。あえて訳せば「n組」「n個の組」とでも言いましょうか。Wikipediaを見ると「組」という訳も使われているみたいですね。

じつは関数定義の次の部分は「タプルを返しますよ」という宣言なのでした。この場合は「三つ組み」を返しますということですね。

 ->(灯油: Int, レギュラー: Int, ハイオク: Int) 

それで、受け取る側は次のようにタプルで受け取ればいい。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表()  ## ★★ここ★★ letは定数の定義

println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

実行結果はこちら。

% swift -i example-01-func-multi-value1.swift ## ← -iでファイルを指定できる
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円

% swift  example-01-func-multi-value1.swift ## ←オプションを指定しないと実行ファイルを作る

% ./example-01-func-multi-value1   ## これで実行できちゃう
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円
  • let —— 定数の定義
  • println —— 1行出力。「\(<変数>)」で変数の値を入れられる。ライブラリとかインクルードしなくても使える。

なお、タプルをひとつの変数に代入することもできるようです。最後に、全部まとめてソースを書いておきましょう。

/* ファイル名: example-01-func-multi-value1.swfit */

// 関数の定義
func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表() // タプルで受け取る
println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

let 価格表 = ガソリンスタンドの価格表() // こうすることもできる
println("本日の価格(税込) -- 灯油:\(価格表.灯油)円 レギュラー:\(価格表.レギュラー)円  ハイオク:\(価格表.ハイオク)円");

2014-06-03

まさか新しいプログラミング言語Swiftが出てくるとは

アップルのWWDCが始まった。まず言っておきますけど、これは世界「開発者」会議であって、アップルの新製品発表会ではありません。 したがって、この会議で新製品が出てこないのは「あたりまえ」なのです。新製品が出てくることがおかしいのです。

しかし、新しいプログラミング言語が出てくるとは思いませんでしたな。 新しい市場を切り開いてくれますなあ。アップルさん。

おかげで新しいネタはできますが、ついていくのは大変です。

開発者も、みんなそんなにswiftに移行はできないのではないでしょうか。

SwiftはSwiftでも、Jonathan Swiftの『ガリバー旅行記』に出てくる巨人のようになってしまいやしないだろうか。