이 포스팅은 아래의 코드에 달린 코드리뷰에 대한 답글로 이뤄질 것이다!
enum Country {
case Korea
case Japan
case China
case America
case France
func getName() -> String {
switch self {
case .Korea:
return "한국"
case .Japan:
return "일본"
case .China:
return "중국"
case .America:
return "미국"
case .France:
return "프랑스"
}
}
}
(🦉 붱이 감사해영)
내가 코드를 짤때에는 프로퍼티에 대해 이해가 없어서 어떨때 연산프로퍼티를 쓰고 메소드를 쓸지에 대해 기준이 없었다.
그래서 익숙한 메서드로 구성했다.
enum Country {
case Korea
case Japan
case China
case America
case France
var countryName: String {
switch self {
case .Korea:
return "한국"
case .Japan:
return "일본"
case .China:
return "중국"
case .America:
return "미국"
case .France:
return "프랑스"
}
}
}
지금 다시 코드를 짠다면 위와 같이 연산 프로퍼티를 읽기 전용으로 구성할 것이다.
프로퍼티와 메서드를 어느정도 써봤고, 정리해본 결과 어느정도 기준이 생겼다.
연산 프로퍼티와 메서드를 결정하는 기준은 프로퍼티의 값을 변경하는지이다.
내가 원했던 작업은 case별로 나라 이름을 반환해주는 것이므로 프로퍼티의 값을 변경하지 않기 때문에 연산 프로퍼티로 구현할 것이다.
코드로 둘의 차이를 알아보자
struct Point {
var x: Int
var y: Int
func opposite() -> self {
return Point(x: -x, y: -y)
}
mutating func setOpposite(_ opposite: Point) {
x = -opposite.x
y = -opposite.y
}
}
opposite()
가 접근자(getter)와 같은 역할을 하고 있다.
setOpposite()
가 설정자(setter)와 같은 역할을 하고 있다.
struct Point {
var x: Int
var y: Int
var opposite: Point {
get {
return Point(x: -x, y: -y)
}
set(opposite) {
x = -opposite.x
y = -opposite.y
}
}
}
var position = Point(x: 10, y: 20)
position.opposite
opposite
라는 computed Property
를 선언했다.
접근자(getter)와 설정자(setter)가 모여 있는 모습을 볼 수 있다.
위의 타입으로 생성된 인스턴스를 사용하는 입장에서는 저장 프로퍼티처럼 사용할 수 있다.
글 잘 읽었습니다 :) 질문 드리고 싶은 것이 있는데 마지막 비교에서 메소드를 통해 내부 값에 접근하기 위해서는 접근자, 설정자 역할을 하는 2개의 메소드가 필요하다고 하셨는데 하나의 메소드 안에서 로직을 처리한 후 return하는 구조로 만들면 하나의 메소드에서 처리 가능하지 않나요? 연산 프로퍼티도 getter 내부에서 set의 로직을 처리하여 get 할 수 있는 것으로 알고 있는데 메소드와 computed의 모두 따로 만드려면 2개로 구현 가능하고, 읽기(get)에 한정해서는 두 방법 모두 하나의 표현으로 구현 가능하지 않은가 해서요! 제가 써주신 글을 이해 못한 걸 수도 있을 것 같아서 질문드립니다! 감사합니다 :)