26
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift(一人)Advent Calendar 2015

Day 8

private(set)とArrayのappendメソッド

Posted at

Swiftにはprivate(set)という修飾子があります。
これは外部からの代入を防ぐ修飾子です。

class MyClass {
    private(set) var value = 0
    
    func setValue(value: Int) {
        self.value = value // エラーにならない
    }
}

MyClass().value = 1 // エラーになる

private(set)は代入だけでなくArrayのappendメソッド等にも有効です。

class MyClass {
    private(set) var value = [Int]()
}

MyClass().value.append(1) // エラーになる

なぜappendメソッドも呼べなくなるか

appendがmutatingなメソッドだからです。
mutatingなメソッドは内部で自身の再代入を行っています。

再代入するのでsetの一種と見なされてエラーになったのだと思われます。

// 多分下のような実装
mutating func append(element: Generator.Element) {
    self = self + [element]
}

実際にメモリ番地を調べた所、append前と後で変更されていました。

var arr = [Int]()
print(unsafeAddressOf(arr)) // 0x00007fa002611f40
arr.append(1)
print(unsafeAddressOf(arr)) // 0x00007fa00268cac0

didSetとArrayのappendメソッド

private(set)の話と同様で、Arrayのappendメソッドを呼んだ時にdidSetも走ります。

class MyClass {
    var value = [Int]() {
        didSet {
            print("didSet")
        }
    }
}

MyClass().value.append(1)
26
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?