Actor Hashable

whiteboardObject와 timestamp를 갖고 있는 register를 Actor로 구현을 해서, 기존에 고민하던 whiteboardobject에 대한 동시성 문제를 해결하려고 했습니다.

하지만 Actor를 Hashable하게 사용하려고 할 때 문제가 발생했습니다.

내부에 갖고 있는 whiteboardObject를 비교하여 Hashable을 구현하려 했습니다.

격리규칙 위반

그래서 기존에 작성하던 코드처럼 작성을 해보았습니다.

actor Register {
    var whiteboardObject: WhiteboardObject
    var timestamp: Timestamp

    init(whiteboardObject: WhiteboardObject, timestamp: Timestamp) {
        self.whiteboardObject = whiteboardObject
        self.timestamp = timestamp
    }
}

extension Register: Hashable {
    static func == (lhs: Register, rhs: Register) -> Bool {
        lhs.whiteboardObject == rhs.whiteboardObject
    }

    public func hash(into hasher: inout Hasher) {
        hasher.combine(whiteboardObject)
    }
}

image.png

위와 같은 오류 메시지를 발견할 수 있습니다.

이 오류는 Actor 격리(actor isolation) 규칙을 위반했음을 나타냅니다.

<aside> 💬

Swift의 actor는 **데이터 경쟁(data race)**을 방지하고 안전한 동시성(concurrency)을 보장하기 위해 설계되었습니다.

Actor 내부의 속성(예: whiteboardObject)은 기본적으로 actor-isolated 상태에 있으며, 동일한 actor의 동기(synchronous) 메서드에서만 직접 접근할 수 있습니다. nonisolated context는 다음을 포함합니다:

  1. actor 외부에서 접근하려는 경우.
  2. nonisolated 메서드나 속성에서 접근하려는 경우.
  3. 다른 actor 또는 Task에서 접근하려는 경우. </aside>

위와 같은 경우는 여러가지 문제점이 있습니다.

whiteboardObject는 actor내부에서만 접근 할 수 있지만

해결법

여러 문제들을 해결 해 봅시다.