詳解Swift改訂版買いました
詳解Swift改訂版を買いました。
Objective-C版も持っています。Objective-C版に比べて推敲が甘いかなと感じる部分が特に最後の方で多かったです。版を重ねて修正が加わるといいです。
以下、自分用のメモ。
構造体
イニシャライザ内でメソッドを呼ぶのは初期値設定が全部済んでから。
構造体の内部で別の構造体を定義出来る。
構造体の内部で、typeエイリアスを使って、別名を与えることが出来る。(メリット?)
タイププロパティの値を変更するインスタンスメソッドにはmutatingは不要。
タイププロパティの初期化のための式は値が必要とされた時に初めて評価される。
didSet WillSetはinit()内での設定では呼ばれ無い。didSetで値を設定しても再帰的に呼ばれることはない。
オプショナル
オプショナル==nilはnilかどうか
オプショナル==非オプショナルは中身を比べることが出来る
if letのほかにif varもある
readLineは標準入力
??の右はオプショナルでもいい。??は連鎖できる。
配列
配列を反対にするreverse()というメソッドがある。
String
Characterの配列からStringインスタンスを作るinitメソッドがある
UnicodeScalarにはvalueプロパティがあって値を取り出せる
辞書
新規はdict[a] = aaa
削除はdict[b] = nil
updateは更新、ただしもとからない場合は作成しない。
Tuple
let aTuple = (1, 2, 3)
let (a, b, c) = aTuple //これが出来る
let (aa, _, _) = aTuple //使わないときは_が使える
値が一つだけのTupleはその値だけと変わらない
要素が一つもないことを()で表現。Voidは()の別名
違うキーワードのTuple間の代入は無理。型が同じでも。一度キーワードなしにキャストすればOK
キーワード付きのタプルの代入では順番が違っていてもキーワード毎に要素が代入される。キーワードがない部分は順番通りに代入される。
タプルにTypealiasでなまえをつけることができる。
Switch
オプショナル付きのタプルを扱える
switch a {
case (0, b?):
break
}
のように使う。
Enum
それぞれの要素は大文字で始める →Swift3から小文字になりました。
計算型のプロパティは作成出来る。格納型は無理。
タイププロパティなら格納型、計算型のも作成出来る
タイプメソッドも定義出来る
enumのメソッドで自身を表すselfが使える
enumにはunion typeもある。付加情報またはペイロードという。
値型と共用型は別のものとしないといけない。
enum TestEnumUnion {
enum TestEnumUnion {
case testUnionStr(String)
case testUnionInt(Int, Int)
}
let a = TestEnumUnion.testUnionInt(0, 0)
let aa = ["aa" : a]
if case .testUnionInt(0, 0)? = aa["aa"] { //これができる
}
演算子
a % b = cで余りcの符号はaと同じ。bの符号によらない。
===と!==はインスタンスの実態が同じかどうか
@autoclosureをつけると遅延評価する
演算子の宣言はトップレベルで
値を変更するときも&は不要
クラス
クラスのインスタンスをletにしても格納型プロパティを変更出来る。
Super Classを持たないクラスはベースクラス
is はサブクラスでもtrueを返す
dynamicTypeはそのインスタンスのクラスを表す →Swift3でtype(of:)に変更になった
メモリ管理
クロージャは参照型
===はクラスのインスタンス同士に使って、インスタンスが同一かどうか
新しく作成したインスタンスをweak変数に入れるとすぐに解放される。変数はnilになる。
下のb.dynamicTypeのオプショナルチェーンの返りはOptional<Int>
class A {
func funcA(a: Int) -> Int? {
if 0 < a {
return a
} else if a < 0 {
return -a
} else {
return nil
}
}
}
var a:A? = A()
let b = a?.funcA(100)
b.dynamicType
オプショナルチェーン経由で値を返さないfunctionを実行したら
cはOptional<()>になる
class A {
func funcB() {
}
}
var a:A? = A()
let c = a?.funcB()
c.dynamicType
オプショナルチェーンを左辺にして代入操作を行える。
右辺は評価される
****?.**** = ****()
途中でnilチェックに引っかかったら代入は行われない。
****?.****への代入はVoid?を返す。つまり
if (****?.**** = ****()) != nil {
}
が行える。
プロトコル
構造体や列挙体にもプロトコルを適用出来る。
- インスタンスメソッド、タイプメソッド
- 「演算子による関数」の宣言
- インスタンスプロパティ、タイププロパティ
- イニシャライザ
- 添字付け
- typealias宣言
プロトコルからプロトコルに継承出来る
クラスに付けられることが前提のプロトコルは名前の横に: classと書く。何かのプロトコルを継承するときは,に続けて書く。
複数のプロトコルを組み合わせて新しいプロトコルを作るprotocol protocolNew: プロトコル1, プロトコル2 {}という書き方がある。
protocol<プロトコル1, プロトコル2>という書き方も出来る。
コメント
コメントを投稿