swift
array は copy-on-write
index 指定で領域外を参照するとエラー
そもそも index を直で指定する必要性があまりない
for in や高階関数でなんとかできる
index によるループは swift 3 で消えた
subscripting は気をつけて行うこと
不正なインデックスアクセスによるクラッシュは安全ではない、と言われるが、メモリ安全性という側面であれば安全性は保障されている
高階関数
短い
エラーの入る余地が少ない
明瞭
高階関数の中で副作用のある処理をするな
クロージャのローカルに状態をもつのと高階関数を組み合わせると便利だが、それとは異なる
map は順序を保証してないが多分大丈夫そう
bigArray . filter { someCondition }. count > 0
フィルタしたものをかうんとするな
bigArray . contains { someCondition } の方が、パフォーマンス的にもよい
forEach
for ループとあまり変わらない
提供したい関数が一つの場合は forEach の方がわかりやすい
return してる場合は挙動が変わってしまう
break はされないし値も返さない
return のきょどうがめいりょうではないので、
array と binding
???
Sequence を extension して独自の高階関数を作れるぞ
独自定義すれば理解が簡単になるし、エラーの起こる余地も減らせる。結果も let にできる
for文
メモリ管理
メモリ安全性
Properties
Property とは、特定のクラス、構造体、enum に関連する値のこと
Type Property: 特定の型のインスタンスではなく、型そのものに関連した Property
Stored Property は、インスタンスの一部として定数ないし変数を 保持 する
クラス、構造体でのみ提供可能
Computed Property は、その値を 計算 する
クラス、構造体、enum で提供可能
Property Observer は Property の値の変更を監視し、変更時にカスタムアクションを実行できる
自身で定義、あるいは親クラスから継承した Stored property に対して設定可能
Lazy Stored Properties
それが実際に使用されるまで、初期値の計算を 遅延 できるプロパティ
var で定義すべき
let、すなわち定数の Property は、インスタンスの初期化完了前に値を持つべき だが、lazy stored property はインスタンス初期化時でも値を保持していない可能性があるため
Lazy stored property の使い所
その値がインスタンスの初期化完了後まで値がわからない外部要素に依存している場合
その値の計算が複雑、あるいは高コストであり、必要とされる時までそれを実施すべきでない場合
code:swift
class DataManager {
lazy var importer = DataImporter()
}
// 下記時点では、DataImporter のインスタンスは作成されない
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// 下記で初めて作成、処理が行われる
print(manager.importer.filename)
API デザインガイドライン。後で読む