注、C#等の経験者でSwift未経験の人は、このあたりでSwift文法を参考のこと : Swift文法メモ
#[0] C#な人とかに向けての、序文
MSのVisualStudio2015でSwift2.0もどき*(RemObjects Silver)*を実行してみる、続き。
RemObjects Silverは、Delphi互換のコンパイラなどを作ってきた本職の会社のクロス開発向け無償製品。
RemObjects社が言うとおりかなりSwift2.0準拠なはずと思っているし...うまくいけば、iOSのコードをWindowsPhoneに移植する際にC#側からSwiftのコードを呼ぶといった(マイナーな)ニーズにも対応できるはずだが、VS2015との相性もあるだろうし...実際のところはどうか。
各所にあるSwiftの文法ガイド&Swift1.0系/2.0系のコードを参考にしながら、
RemObjects SilverのSwift準拠性を、淡々と検証していく。
以下、前回のVS2015&Silverインストール時に作った、.NETコンソール上で実行していく。
import System.Collections.Generic
import System.Linq
import System.Text
import System.Threading.Tasks
println("Console App:")
////// some codes ///////
let x= Console.ReadLine()
という雛形を用い、
////// some codes ///////というところに、
いろいろな検証コードを貼り付けていく。
#[1] 基本文法と制御構造(for/while)
1) 文字列内包表記\(x)のコード
let x= Console.ReadLine()
println("Hello, \(x) さん")
2) for文
参考 Swift さくっと確認したい基礎文法 [いろんなループ処理]
=>参考先と出力が同一の場合に、"動作"とする。
for in文
まずは、"Swiftではなるべくfor-in文を使うのが良さそう"というfor-inを使ってみる。
var sum:Int = 0
for num in 1...5 {
sum += num
println("\(num)回目:\(sum)")
}
あれ、1...5の表現がエラーになる。。
動作せず。というか、エラー時にVS2015ごと落ちた。
気を取り直して、再起動すると動作。
コレクション(Array型)の扱ったfor inループ:
let numList = [10,43,231,43,54]
for num in numList {
println(num)
}
動作。
(付記) 1...5の表現は、こう書いても動作:
let numList = 1...5
for num in numList {
println(num)
}
Dictionary型のfor inも動作。
let menuList = ["coffee": 320, "tea": 280, "latte": 380, "cappuccino": 380, "mocca": 400]
for (menu,price) in menuList {
println("\(menu)は\(price)円")
}
文字列のcharでの取り出しも動作
for char in "Swift"{ println(char)}
コンパイラーと実行環境のひも付けに怪しいところがありそうだが、for in文は普通に使える。
###for等のループへのラベル付け [現状、未対応]
Swift文法で、ちょっと興味深い、ループへのラベル付け:
xLoop:for x in 0...5 {
yLoop:for y in 0...5 {
if (x<y){
print("\n")
continue xLoop // yLoopのfor文処理を中断して、xLoopのfor文に抜ける。
}
print((x,y))
}
}
Swiftでの出力は、以下のようになる。
(0, 0)
(1, 0)(1, 1)
(2, 0)(2, 1)(2, 2)
(3, 0)(3, 1)(3, 2)(3, 3)
(4, 0)(4, 1)(4, 2)(4, 3)(4, 4)
(5, 0)(5, 1)(5, 2)(5, 3)(5, 4)(5, 5)
が、continue xLoopがコンパイルエラーとなった。
3) while文
Swiftのwhile文は特に変わったところなしとのことなので、
無限ループにおけるVS2015コンソールの挙動を見てみる。
while(true) {println("無限ループ")}
動作。
コンソールに普通に無限ループが走り、強制終了させるとVS2015に無事戻れた。
#[2] 型の扱い (cast&optinal)と応用
1) 型キャスト
普通のforループの検証も兼ねて:
let drinkList = ["coffee","tea","latte","cappuccino","mocca"]
for(var i=0; i<drinkList.count; i++) { // drinkList.count で配列の長さを取得
let castedString = i + ":" + drinkList[i] //型キャスト
println(castedString)
}
動作。
##2) optional型のコード
実行時エラーになるものを入れてみた: [参考 Web+DB Press Vol.84記事]
let some = "10".toInt() // {Some 10}
let none = "foo".toInt() // nil
println (some!) // 10
println (none!) // 実行時エラー!
初回実行時、VS2015が落ちた(実行環境再起動)。
2回目実行時、正しく、println (some!) まで動作し、println (none!)で実行時エラーとなった:
VS2015らしい?、実行時エラーチェックが行われている。
3回目実行時、VS2015が落ちた(実行環境再起動)。
むむむ、、、実行時エラーの扱いに難があるのか。
気を取り直して、whileループ内で、何パターンか試してみよう。
...入力値次第でいかにもVS2015が落ちそう ^^;
var count = 5
while(count > 0) {
let some = Console.ReadLine().toInt()
println (some)
println (some!) ;println() // 実行時エラー!
count--
}
初回実行時、実数値"0.1"を入れたら見事に、VS2015が落ちた。
再起動後、広い心でもう一度実行:
文字"a"の入力に対し、正しく、実行時エラーの警告が出る。
三度目の実行、改めて実数値"0.1"を入力すると今度は、正しく、実行時エラーの警告が出る。
#今回のまとめ
RemObjects Silverは、VisualStudio2015上で、それなりにSwift2.0らしい動作をする。
わかったこと:
- for等のループへのラベル付けに、未対応。
- 実行時エラーの扱いで、VisualStudio2015がこけることが多発*(エラーをちゃんとキャッチすれば大丈夫か?)。
未対応のところを把握しておけば、Windowsで、軽くSwift学習する、といった用途には使えるだろう。
将来的に使いたいところは、Swiftライブラリの.NETやJVM上での動作なのだが、まぁ、そのまま動くは現状厳しそう。