🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

Swiftに入門してみたメモ

べ、別に鞍替えとかそういうのじゃないんだからね!
時間かけてなんかやったなら、その記録を残そうという趣旨でございます。

はじめに

プログラミングというものに関する私のスキルセットは以下です。

  • 前の会社で3ヶ月Javaやってたけど忘れたしあんなもんはノーカン
  • よってJavaScriptからプログラミング道に入門
  • JavaScriptをよく書くようになってやっと2年過ぎた
  • Perlを業務上わりとよく見る/ちょっとだけ書く
  • Ruby/PHPならコピペでならなんか作れる

というような感じなので、ことプログラミングの根源たる部分に関しては見当違いのこととか多数あると思います。
なんかあったら教えてくださいまし。

Swift

とりあえずTodoApp作りました。

  • ヘッダとリストで構成されてて
  • ヘッダの新規追加ボタンから新規追加ができて
  • リストをスワイプすると編集と削除ができて
  • データがアプリ側に保存できる

そういうThe TodoAppを。
てか以下のサイトのやつです。

参考:作って学ぶSwift/iOSアプリ入門Camphor- Tech Blog | Camphor- Tech Blog

大変勉強になりました!

さて本題。
以下、むってなったものやなるほどーってなったものたち。

let

ES6でもletってのは使えますが、このletはまた少し違う。
厳密に同じかはわからんけど、いわゆるconstと同じで「再定義しない変数」に使う。

まぎらわし・・。

型付けできる

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

あんまり感動がないけど、これは例が悪い気もする。

Xcode(てかIDE)いい

これはいいものだ・・・。
ちょっとでも書き方間違ってたら教えてくれるし、補完バリバリやし。
これがコンパイルする言語の真髄ですか。

おわりに

今回さわった範囲での言語仕様として気になったトコは以上です。
もっとも、まだまだ他にも機能あるっぽいけど。

言語以外の部分についてもざっと。

  • Swiftもアプリ作るのも、思ってたよりずっとわかりやすい
  • Swiftやと**.m とか **.hとかいらないんかー
  • ファイル増やすだけでそのクラス使えるようになるんか・・
  • レイアウトの絶対配置つらくなってこんのかね
  • というかボタン設置するだけに5行くらいだらだら書くしかないのか
  • GestureRecognizerのアプローチ良いな
  • 用意されてるUIパーツがイベントまで全部管理してくれるの楽そう
  • UIKitまわりで ? とか ! まみれになるとこがイマイチしっくりきてない

てかはてなブログSwiftのSyntaxHighlightはよ!

参考:The Swift Programming Language: A Swift Tour