Open8

Swift勉強ノート

nabeyangnabeyang

T?とは

T?Optional<T>のシンタックスシュガー。1行目と2行目は同じ意味。

let a: Int? = 12
let b: Optional<Int> = 12
nabeyangnabeyang

T!とは

T!の型はOptional<T>で、暗黙的に強制アンラップされる。必要な場面はよく分からない。
a.countb!.countは同じことになる。

let a: String! = nil
let b: String? = nil
print(a.count)
print(b!.count)
nabeyangnabeyang

キャストについて

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)
nabeyangnabeyang

リテラルにはデフォルトの型がある

各リテラルは型推論される型が決まっている。上の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
nabeyangnabeyang

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
nabeyangnabeyang

Array[Element]をletで宣言したときappendを使おうとするとエラーになる件について

Array[Element]はstructでappendはmutatingメソッドなんで、次のようなエラーが出る。

Cannot use mutating member on immutable value: 'a' is a 'let' constant
nabeyangnabeyang

structにあるプロパティ宣言時に代入されてる値について

例えば、次の型Avar 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
    }
}