Swiftに入門してみたメモ
べ、別に鞍替えとかそういうのじゃないんだからね!
時間かけてなんかやったなら、その記録を残そうという趣旨でございます。
はじめに
プログラミングというものに関する私のスキルセットは以下です。
- 前の会社で3ヶ月Javaやってたけど忘れたしあんなもんはノーカン
- よってJavaScriptからプログラミング道に入門
- JavaScriptをよく書くようになってやっと2年過ぎた
- Perlを業務上わりとよく見る/ちょっとだけ書く
- Ruby/PHPならコピペでならなんか作れる
というような感じなので、ことプログラミングの根源たる部分に関しては見当違いのこととか多数あると思います。
なんかあったら教えてくださいまし。
Swiftで
とりあえずTodoApp作りました。
- ヘッダとリストで構成されてて
- ヘッダの新規追加ボタンから新規追加ができて
- リストをスワイプすると編集と削除ができて
- データがアプリ側に保存できる
そういうThe TodoAppを。
てか以下のサイトのやつです。
参考:作って学ぶSwift/iOSアプリ入門Camphor- Tech Blog | Camphor- Tech Blog
大変勉強になりました!
さて本題。
以下、むってなったものやなるほどーってなったものたち。
型付けできる
var count: Int = 1 let name: String = "Swift" let arr: [String] = ["foo", "bar"]
出ましたJavaScriptしか知らん人泣かせの概念!
とはいえそんなに難しいものじゃない + むしろありがたいと感じる今日このごろ。
指定しなくても動的に型付けしてくれるらしいけど、
これはもう片っ端から付けるようクセにしたほうがいい気がする。
Dictionary
オブジェクトでやりたいことをやる時に使う感じ?
でも型で縛って使うので、定数オブジェクトみたいな用途にしか使えないかも。
まあなんでもできちゃうjsが特殊なんかね・・。
var langDict: [String:String] = [ "ruby": "るびー", "js": "ジャッヴァスクリプト" ]
{} じゃなくて [] っていう!!
タプル
新たな概念や。
let name: (first: String, last: String) = (first: "Lea", last: "der22") let res: (min: Int, max: Int, sum: Int) = (min: 1, max: 5, sum: 20)
こういう組み合わせの内容がくるってのを定義できるのね。
シングルクオート使わない
// let name = 'これダメ' let name = "これOK"
これは中々に衝撃でした。
ダブルクオートなんか使うんじゃねえ!って言われて育った身としては!
セミコロンも括弧もいらない
if hoge > 10 { println("Over 10!") }
これも慣れの問題でしょうがだいぶ違和感が・・・。
for inで配列まわせる
// まわせる! for word in ["hoge", "fuga", "piyo"] {} // indexほしいとき for (index, word) in enumerate(["hoge", "fuga", "piyo"]) {}
そんなことが・・。
ちなみにDictionaryも回せるらしい。
Optional
型の後ろに ? つけるやつ。
これをしないと、nil(nullじゃない!)を代入できない。
var num: Int? = 1 num = nil // ok num!++ // ただし ! つけないと元の型として使えない
そして使うときは ! つけないといけない。
いかにJavaScriptがなんでもアリの世界やったかを味わっています。
巻き上げとかない
functionとは違うのだよ!
// エラーになる // println(getA()) func getA() -> String { return "A" } println(getA())
まあ、そんな書き方する機会ないんやろけど。
ArrowFunctionではない
このペースでメモってるとキリない気がしてきた。
// -> は戻り値の型を書いてる func getA() -> String { return "A" } // 何も返らないやーつ func say(message: String) -> Void { println(message) }
newとかいらない
いらないんですって。
Enum
どっかで見た・・・TypeScript?
enum Suit { // case で定義してく case Spades, Hearts, Diamonds, Clubs func desc() -> String { switch self { // 使うときドットつける case .Spades: return "spades" case .Hearts: return "hearts" case .Diamonds: return "diamonds" case .Clubs: return "clubs" } } func color() -> String { switch self { case .Spades, .Clubs: return "black" case .Hearts, .Diamonds: return "red" } } }
Classes and Structures
まあコレが一番不慣れなポイントですよねー・・。
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }
ちなみにstructとclassの違いは参照かコピーからしい。
structは構造をもてる変数ってイメージなんかね。
init() 複数書いて振る舞い変えられるとか、そういうもんなんかーって感じ。
class Vehicle { var numberOfWheels = 0 } class Bicycle: Vehicle { override init() { super.init() numberOfWheels = 2 } }
: つけるのは型付けるときだけかとおもいきや、継承するときにも使うらしい。
Protocol
たとえばとあるクラスAを作る時に、このメソッドAとこのメソッドBは絶対実装してね!って時。
その約束して欲しいことをプロトコルとして切り出して用意しといて、担保する・・・みたいな?
protocol ProtocolForA { func methodA() func methodB() } class Hoge: ProtocolForA { // どっちかでも実装漏れるとエラー func methodA() func methodB() }
概念としては納得感あるものの、実際に使える気はしないやーつ・・。
// : つけるけど今度は継承でもない struct SomeStructure: FirstProtocol, AnotherProtocol { } // 継承するなら先に書いてカンマでつなぐ class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol { }
目が慣れない!
Extension
既存のクラスやらの動きを拡張したいときに使うとのこと。
まさかの事態です。
extension Int { func show() { println(self) } } 8.show() // 8
あんまり感動がないけど、これは例が悪い気もする。
おわりに
今回さわった範囲での言語仕様として気になったトコは以上です。
もっとも、まだまだ他にも機能あるっぽいけど。
言語以外の部分についてもざっと。
- Swiftもアプリ作るのも、思ってたよりずっとわかりやすい
- Swiftやと**.m とか **.hとかいらないんかー
- ファイル増やすだけでそのクラス使えるようになるんか・・
- レイアウトの絶対配置つらくなってこんのかね
- というかボタン設置するだけに5行くらいだらだら書くしかないのか
- GestureRecognizerのアプローチ良いな
- 用意されてるUIパーツがイベントまで全部管理してくれるの楽そう
- UIKitまわりで ? とか ! まみれになるとこがイマイチしっくりきてない
てかはてなブログ、SwiftのSyntaxHighlightはよ!