euphonictechnologies’s diary

Haskell超初心者の日記です。OCamlが好きです。

follow us in feedly

Swiftに触ってみた

事情があってSwiftを触ってみた。さらっと覚えておくことと所感をメモしておく。

覚えておくこと

Optional型はアンラップするとき基本こう使う

if let unwrappedNonNilVariable = NillableVariable {
    something...
}

Optional型な引数とそうでない引数でシグネチャは区別できないけどprotocolのconformabilityでは区別されてコンパイラは文句をいう

たとえばこんな問題、 UITableViewDelegateとUITableViewDataSourceを実装してUITableViewにconformableなViewControllerを実装するときに、ここらあたりを参考に実装して

class MyViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    ...

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return 0
    }

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        return nil
    }

}

とする、と、

MyViewContoller.swift:12:1: Type 'MyViewController' does not conform to protocol 'UITableViewDataSource'

なんやねん。ここでtableView: UITableView!!はいらない。APIのアップグレードで要らなくなったらしい。というわけで、このコードを消さないで正しいシグネチャの関数を追加で書いた。どうもこのふるいメソッドの方を消すのを忘れていたらしい。

するとなぜか!が付いている方のコードが動いてたりする。いまのバージョンのコンパイラは知らない。おそらくセレクタにシグネチャの区別は関係ないからだろう。protocolのconformabilityとセレクタの挙動にconsistencyはない。

rangeを使ったforの書き方と普通のforの書き方が違う

for y in 0..<height in {
    for x in 0..<width in {
    }
}
for var y = 0; y < height; ++y {
    for var x = 0; x < width; ++x {
    }
}

この前者にvarが要らないの、もしくは後者にvarが必要なのにconsistencyなんかないと思うが、仕様書いてる人は気づかなかったのかな。

クラスメソッドの引数ラベルは省略できないっぽい。コンストラクタも

普通の関数は大丈夫。不便じゃね?

数値型変数をNSLogしたい

ついつい忘れがち。

NSLog("%f", doubleVar.native)

とするか素直に

NSLog("\(doubleVar)")

とする。

並列プログラミングをしたい

Grand Central Dispatchを使う。これを使うと楽。 Simple synchronization functions for Swift, wrapping the Cocoa NSLocking classes

コンパイル中にXcodeが死ぬ

耐えろ。

APIがコロコロ変わる

耐えろ。

基本Appleが好きな人は全肯定なのであまりSwiftの悪口を言わない

Swiftって名前がぱくりだとか、アイコンもパクリだとか。 Swift について - Oh, you `re no (fun _ → more)

iPhone6 Plusの角で鼻の軟骨を砕かれます。

ジェネリックの扱いに関する理論的な公開文書はまだ無いようだ

たとえば関数定義は次の2通りでかける、ということは色んな所で言われている:

func fn1(x:Int) -> Int {
    return x * 2
}

let fn2 = { (x:Int) -> Int in
    return x * 2
}

で 答えは

f:id:euphonictechnologies:20141022191704p:plain

となる、が。

func id<typeA>(x:typeA) -> typeA {
    var ret: typeA
    ret = x
    return ret
}

let id2 = { <typeA>(x:typeA) -> typeA in
    var ret: typeA
    ret = x
    return ret
}

後者は許されてない。公式になんでか書いてあるものは見つけられなかったのだけど、おそらく値多相の問題? 当然typeAが参照型の場合、問題が起こることが容易に予想される。 例えばこんな話

Swift extensions and generics — Swift Programming — Medium

なので、Swiftの言語的特性をフルに使ってどうこうするよりは平易なプログラムを書くほうが地雷は少ない。

let多相に関する参考資料

MLのlet多相とか値制限とかよく分からなかったので調べてみた - Homoiconic Days

ML多相 - sumiiの日記

ML多相の続き - sumiiの日記

OCamlテクニック/let-poly - ocaml-nagoya

http://logic.cs.tsukuba.ac.jp/~kam/lecture/complogic2013/inf-poly.pdf

あとコンパイル時の型解決に関する外観を得るのに良い参考資料:

http://logic.cs.tsukuba.ac.jp/~kam/lecture/plm2013/6b.pdf

Ocamlの日本語で読める(私が)最高の入門(だと思っている)資料:

http://www.math.nagoya-u.ac.jp/~garrigue/lecture/tsukuba07/tsukuba.pdf

あとTAPL:

型システム入門 −プログラミング言語と型の理論−

型システム入門 −プログラミング言語と型の理論−

  • 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
  • 出版社/メーカー: オーム社
  • 発売日: 2013/03/26
  • メディア: 単行本(ソフトカバー)
  • クリック: 68回
  • この商品を含むブログ (10件) を見る

オーム社のページからは電子書籍版が買える。

型システム入門 プログラミング言語と型の理論 | オーム社eStore

一番重要:Apple公式資料

これ

The Swift Programming Language: The Basics