Open8
Swift勉強ノート
Swiftについてまとめる。
T?とは
T?
はOptional<T>
のシンタックスシュガー。1行目と2行目は同じ意味。
let a: Int? = 12
let b: Optional<Int> = 12
T!とは
T!
の型はOptional<T>
で、暗黙的に強制アンラップされる。必要な場面はよく分からない。
a.count
とb!.count
は同じことになる。
let a: String! = nil
let b: String? = nil
print(a.count)
print(b!.count)
キャストについて
Int(3.4)
とかはキャストではない。Intのイニシアライザがあるだけ。
public init(_ source: Double)
キャストは次のようなもの
let a: Any = 3 //ダウンキャスト。必ず成功するためasは書かなくてもOK
let b: Int? = a as? Int //アップキャスト。失敗した時はnilになる
let c: String? = a as? String
XCTAssertEqual(3, b)
XCTAssertNil(c)
リテラルにはデフォルトの型がある
各リテラルは型推論される型が決まっている。上のInt(3.4)
でInit(_ source: Double)
に決まるのも、デフォルトの型があるため。
let a = true // Bool
let b = 12 // Int
let c = 3.14 // Double
let s = "h" // String
デフォルトの型でない場合は次のようにすれば良い。
let a: UInt8 = 12 // UInt8
let s: Character = "h" // Character
struct
struct
は値型。
struct
のプロパティを変更するメソッドを作るときはmutating
を付ける(それが好ましいかどうかは別として、言語仕様的に)。
struct A {
var value: Int
mutating func increment() {
value+=1
}
}
mutating
がない場合、次のようなエラーが出る。
Left side of mutating operator isn't mutable: 'self' is immutable
Array[Element]をletで宣言したときappendを使おうとするとエラーになる件について
Array[Element]はstructでappendはmutating
メソッドなんで、次のようなエラーが出る。
Cannot use mutating member on immutable value: 'a' is a 'let' constant
structにあるプロパティ宣言時に代入されてる値について
例えば、次の型A
のvar value = 3
の部分。
struct A {
var value = 3
}
これは自動生成されるイニシャライザのデフォルト引数になる。次が成り立つ。
XCTAssertEqual(A().value, 3)
XCTAssertEqual(A(value: 25).value, 25)
つまり、次の定義と同じということ。
struct A {
var value: Int
init(value: Int = 3) {
self.value = value
}
}