<Enum> RawRepresentable

Enum의 case와 모델을 연결하는 방법.
rawValue로 모델을 저장할 수 있음.
rawValue: PollutionIndicatorModel이런식으로
타입을 내가 원하는 모델로 지정해 줄 수 있음.
열거형을 RawRepresentable프로토콜에 맞추고 일부 필드를 구현하면 됨.

https://kiljh.tistory.com/214

여기서 rawValue를 초기화 할 때
failure initializer를 쓰는 이유는

다른 생성자는 초기화에 실패하면 컴파일 에러가 발생함.
하지만 failure 생성자는 초기화에 실패해도 nil을 리턴해주기 때문에 크래시가 안남. 그리고 nil의 리턴 여부에 따라서 어떤 속성이 초기화에 실패했는지 성공했는지 알 수 있음.

Waste타입에 따라서 return 값이 달라지는
계산속성 rawValue
그리고 리턴값은 PollutionIndicatorMedel타입
rawValue는 계산속성으로 초기화 할 수 없다.
계산속성은 다른 속성의 값을 읽어오거나 수정할 때 사용한다.

그리고 여기에 안나와 있는데 아마 PollutionIndicatorModel속성중에 Waste타입을 갖는 속성이 하나 선언되어 있는 것 같다.

그런데 rawValue가 그 형식을 충족시켜야 하니
이넘 타입안에서 value값에 따라서 초기화를 시켜주는 듯 하다.

그러면 결국 Waste의 모든 케이스들의 rawValue는

struct PollutionIndicatorModel {
value: Int
pollutedArea: Double
waste: Waste
}

정확하지는 않지만 이런식으로 선언된 형식을 원시값으로 갖는 것이다.

여기서는 예를 들면 case glass의 원시값은

case glass = PollutionIndicatorModel{
value: 30, pollutedArea: 23.5, waste: .glass
}

를 갖게되고 이는 구조체의 멤버와이즈 이니셜라이즈에 의해
인스턴스로 생성된다. 결국 하나의 인스턴스를 원시값으로 갖는 셈이다.

  public protocol RawRepresentable {
  associatedtype RawValue

  init?(rawValue: Self.RawValue)

  var rawValue: Self.RawValue { get }
  }

https://jcsoohwancho.github.io/2019-08-19-enum-%EB%8D%94-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0-CaseIterable,-RawPresentable,-%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/
RawRepresentable 프로토콜은 컴파일러가 자동으로 추가해주는 프로토콜이기 때문에 일반적으로는 추가할 필요가 없습니다. 하지만 RawRepresentable 프로토콜이 유용하게 사용할 수 있는 부분이 있는데, 바로 리터럴로 표현할 수 없는 타입을 rawValue로 사용할 때 입니다.

컴파일러가 RawRepresentable 프로토콜을 추가해주기 위해서는, 모든 raw value값이 컴파일 타임에 결정되어야 합니다.(그리고 이것이 enum에서 리터럴을 강제했던 이유기도 합니다.) 하지만 RawRepresentable 프로토콜을 프로그래머가 직접 구현한다면, 이러한 제한을 해제할 수 있습니다. 다만 enum에 직접 구현하지 말고 extension으로 별도로 구현해줘야 합니다.

프로토콜의 요구사항을 보면 RawValue의 타입을 지정해주어야 하고
rawValue를 읽기전용 계산 속성으로 구현해주어야 하고
이 rawValue값에 따라서 rawValue를 다시 이넘타입을 저장해주는 방식이다.

즉 서로 쌍방으로 저장하는 방식인 것 같다..
원시값으로 case를 찾고 case를 통해 원시값에 접근할 수 있도록??

그리고 RawRepresentable프로토콜을 채용하면
좋은점이
1. rawValue
2. associated value를 같이 쓸수 있다는 점이다!!!

좋은 웹페이지 즐겨찾기