序.
MSのVisualStudio2015でSwift2.0もどき(RemObjects Silver)を実行してみる、その3。
前回までで、RemObjects Silverが、うたい文句通り、Swift2.0準拠といえることはわかったので、
今回は軽く文法の確認。クロージャを扱うついでに、.NETのLinqも使ってみる。
**注、Swift未経験の人で概説が必要な時は適宜この記事あたりをチラ見のこと : Swift文法メモ **
# Swuft1.x時代のものなので、現行バージョンでは動かないコードもあるかもだが、参考にはなる
#1. if文、三項演算子、クロージャ
いずれも基本的なところは動作した。
import System.Collections.Generic
import System.Linq
import System.Text
import System.Threading.Tasks
println("Console App:")
let str = "h e l l o w o r l d"
var spcs=""
for c in str{
if c != " " {println(spcs+c)} else {spcs += c} //if文
}
println(" => if文の例\n")
spcs=""
for c in str{
spcs += (c == " ") ? "○" : "" //三項演算子
print(spcs+c)
}
println(" => 三項演算子の例\n")
let arr = split(str) {a in a == " "} // { }部分がクロージャ
for a in arr {println(a)}
println(" => クロージャの例")
Console.ReadLine()
if文はgolangっぽいね、三項演算子はCっぽいが、予想の範囲内。
Swiftのクロージャは、いろいろな書き方が用意されている。
上の例では、split関数が行う文字列分割操作の内容を{$0 == " "}というクロージャで定義している*(要するに空白文字で文字列を分割して、配列を得る)*。
クロージャに慣れるまでは、基本的なところを、Swift のクロージャが面白いを参考にさせてもらったりして書くと良い。
F#やhaskellやscalaなどの(純粋・不純問わず)関数型言語を使ったことがある人は簡潔な略記法でどんどん書けばよいだろう。
私が気に入った書き方は以下:
let arr = split(str) {$0 == " "} // { }部分がクロージャ
#2. Swiftクロージャ渡しで、LINQ
さて、C#で関数型テイストといえば、Linq。
RemObjects Silverの.NET実行環境では、ディフォルトでLinqがインポートされている。
import System.Linq
Swift界隈からの人は、何それ状態と思うので、Modern C# 入門の備忘録 - Linq入門編をチラ見しておこう。
例えば、SomethingsというInt型のコレクションがあるとする。
Somethingsの各要素のうち10以上のものを取り出して、取り出したものを二乗する操作をLinqでは以下のように書く。
//C#の例
Somethings.Where(x => x > 10).Select(x => x * x)
()で囲まれた部分は無名関数。これって、Swiftのクロージャ...なんです、たぶん。
SwiftでLinqを書いてみる:
let arr2 = 1...20 //配列を得る
let arr3 = arr2.Where {$0 > 5} .Select{$0 * $0} // Linq:Where&Select
for a in arr3 {print(a+":")} //(a+":"の部分は暗黙の型変換
実行結果:
C#でLinqの事例は各所に転がっているので、そちらを参考にいろいろと書いてみるとよいだろう。
例:
http://yohshiy.blog.fc2.com/blog-entry-274.html
#Swiftのテイスト的にはF#の事例も参考になりそう。
3. .NET上でLinqを使う意義。
.NET&JVM上のSwift互換環境RemObjects Silverでは、当座、iOS上のSwiftライブラリをそのまま持ってくることは難しそう。.NET環境上ではLinqを使うことで、コレクションの操作などがかなり楽になるのが最大の意義。
また、SwiftからC#ライブラリの呼出方などのマスターにもつながっていくとも期待できる(そのために、近いうちに、C#のdelegateとSwiftのdelegateを比べることとしたい)。
VS2015上で動くRemObjects Silverでは、JVMよりも.NET上でのSwift実行がしっかりとできそうなイメージ。今後は、(自分は使ったことがないのだが、)xamarinのような、クロスプラットフォーム開発環境として進化していくのかもしれない。自分が狙うところは、もう少しRemObjects Silverに慣れた後に書くこととしたい。