SwiftのWikipediaが充実していると聞いたので読んでみた

SwiftのWikipediaが充実していると聞いたので読んでみた「〜してみた」シリーズです。取敢えず公開メモ的な位置です!FacebookでSwiftのWikipediaが結構充実しているという情報が流れてきたので、せっかくなので言語に親しむために読んでみることにしました。今、Appleのドキュメントをゆっくり読み進めていますが、日本語である程度まとまった資料に目を通しておくと理解がしやすくなって良いですね!

ひと通り読んだ感想としては、結構まとまっている。読みやすい。勉強なった。です。Swiftに関して最初に読む資料として良いかも。

メモ

  • Swiftはコンパイラ言語でありながら、インタプリタとしてスクリプトを実行することも可能で、対話実行環境(REPL(英語版))も用意されている。
  • 変数名は絵文字、日本語そして中国語などの言語も使用できる。

dictionary

let people = ["Anna": 67, "Bety": 8, "Jack": 33, "Sam": 25]
  • 整数型と浮動小数点型のどちらでも、コードの見やすさのためにアンダースコアを桁の区切りとして挿入できる
  • 文字列は+演算子および+=演算子で連結できる。
  • String型の変数は内部的にはCocoa (Foundation) のNSStringクラスのインスタンスと互換性があり、キャストもしくはbridgeToObjectiveC()関数を用いることによりNSStringクラスのインスタンスメソッドを呼び出すことができる。
  • タプル
    • タプルは複数の値を一時的にひとつにまとめて扱うための簡易的なデータ構造である。タプルは関数の多値返却などに利用される。
      • タプルって便利なんだなぁ。
    • 代入式で定数または変数に分解することができる。このとき定数/変数名にアンダースコアを指定すると、その値を無視することができる。
    • タプルの各要素にはあらかじめ名前をつけることができ、その名前によって値に直接アクセスすることができる。また、インデックスを指定することでも値にアクセスできる。

タプル1

let (_, message) = errorStatus  // ひとつ目の値は無視する
println(message)
// Not Found

タプル2

let okStatus = (code: 200, message: "OK")
println("\(okStatus.code): \(okStatus.message)")
println("\(okStatus.0): \(okStatus.1)")
// 200: OK
// 200: OK
  • キャスト演算子
    • as: 型キャスト
    • is: 型検査
  • if文: 条件に書けるのはBool値を返す式のみである。またコードブロックを囲むブレースを省略することはできない。
    • こういうのうれしい。表記のブレがなくなる。
  • switch文: 暗黙的にブレークされ、fallthroughキーワードがある場合に限り、次のcase文にフォールスルーする。
    • これも嬉しい。Swiftではbreak記述しなくていいのか。

c言語風のfor文

for var index = 0; index < 5; index++ {
    println("index: \(index)")
}
  • Optional型
    • Swiftでは安全性のため、ある型の定数や変数にnilを代入することは禁止されている。
    • ある値が存在しないことを示すため変数にnilを代入可能にしたい場合には、Optional型でラップする。
    • 任意の型のOptional型は、ラップしたい型名の後ろに”?”を付けて表す。
    • Optional型の定数または変数をアンラップするには、定数または変数名のうしろに”!”を付ける。アンラップする場合には、値が確かに存在すること(nilではないこと)を確認しなければならない。

Optional型の記述

var n: Int = nil  // コンパイルエラー
var m: Int? = nil // Optional型でラップすればnilを代入可能

Optional束縛

if let kiwiIndex = find(fruits, "kiwi") {
    // もしfindからのInt?型の戻り値に値が入っていれば、kiwiIndexにその値を代入する
 
    println("キウイは\(kiwiIndex)番目に見つかりました")
} else {
    println("キウイは見つかりませんでした")
}
  • 関数とクロージャ
    • Swiftにおける関数とクロージャは第一級関数 – Wikipediaであり、普通のオブジェクトと同じように変数に入れたり、引数として受けとったり、戻り値として返すことができる。
    • 関数
      • 外部名と内部で使用する引数名が同じならば、引数名の前に”#”を付けた短縮形を使って書くことができる。
      • 関数の中で関数を定義することが可能である。
        • これいいんじゃないかな。昔inlineBlockでこういう事やろうとしてたこともあるけど可読性が下がる気がしてやめてた。
  • ストアドプロパティ
    • 宣言時に初期化する場合は、型推論により型を省略できる。宣言時ではなくイニシャライザで初期化する場合は、型を明示する。
    • ストアド・プロパティは定義の前に@lazy属性を付けることで、初めてアクセスされる時まで初期化の実行を遅らせることができる。
      • へ~。
  • コンピューテッド・プロパティ: ゲッター/セッターを介してアクセスするプロパティを定義できる。
  • 型プロパティ: 普通のプロパティが個々のインスタンスに属するのに対して、同じクラスの全てのインスタンスで共有するプロパティを、型プロパティという。クラス変数のようなもの

コンピューテッド・プロパティ

これはそのままコピペ。あとで見返すこともありそう。

class Square {              // 正方形クラス
    var sideLength: Double  // 一辺の長さ(ストアド・プロパティ)
 
    var area: Double {      // 面積(コンピューテッド・プロパティ)
    get {  // ゲッター
        return sideLength * sideLength
    }
    set {  // セッター
        sideLength = sqrt(newValue)
    }
    }
 
    init(sideLength: Double) {
        self.sideLength = sideLength
    }
}
 
let sq = Square(sideLength: 5)
println(sq.area)  // 25.0
 
sq.area = 36
println(sq.sideLength)  // 6.0

型プロパティ

class MyClass {
    class var computedTypeProperty: Int { … }
}
 
struct MyStruct {
    static var storedTypeProperty = 42
    static var computedTypeProperty: Int { … }
}
  • イニシャライザ
    • コンビニエンス・イニシャライザはinitキーワードの前にconvenienceキーワードを置く。
    • Objective-Cでは指定イニシャライザは規約でしかなかったが[4]、Swiftでは文法として厳密に検査される。
      • うれしい
  • 継承
    • Objective-CではNSObjectが全てのクラスの共通の基底クラスであったが、Swiftにはそのような全てのクラスに共通の基底クラスというものは存在しない。

書いてみた

is型検査の使い方がよくわからなかったので書いてみました。書いただけでXcodeが検査してエラー出してくれました。ただ、これ、is Stringにしてもエラーです。エラー文言は違ってis is always trueということです。わかりきってるだろってことなんでしょうか。

Is

もう少し学習が必要

  • ジェネリック
  • 型束縛

参考

Pocket
LINEで送る

You may also like...