Swift 5.1에서 추가된 기능
우선 프로퍼티 래퍼를 이용해서 해결할수 있는 문제가 무엇인지부터 알아보자
struct Adress {
private var _town: String = ""
var town: String {
get { return self._town.capitalized}
set { self._town = newValue}
}
init(town: String) {
self.town = town
}
}
let adress = Adress(town: "melbourne")
print(adress.town)
// Melbourne
이렇게 도시의 이름의 앞글자를 대문자로 바꾸는데 성공했다
그런데 사람이름도 앞글자가 대문자여야한다
struct Person {
private var _name: String = ""
var name: String {
get { return self._name.capitalized}
set { self._name = newValue}
}
init(name: String) {
self.name = name
}
}
let person = Person(name: "woojun")
print(person.name)
// Woojun
이렇게 해서 사람의 이름의 앞글자 역시 대문자로 바꾸는데 성공했다
name을 대문자로 바꾸는거나 town을 대문자로 바꾸는거나 같은 양식을 사용한다
그래서 번거로움을 없애기 위해서 재사용 가능한 코드를 만들어보자
@propertyWrapper
struct Capitalize { }
이렇게 타입 앞에
@propertyWrapper를 붙혀 컴파일러에게 "이 타입은 특별하다"고 준다
그래서 이녀석을 Perosn이나 Adress같이 Type앞에 붙여주는게 아니라 그안의 프로퍼티 앞에다가 붙여준다
그러면 그프로퍼티가 어떻게 행동할지를 정할수 있고 그행동하는 역할을 하나의 type으로 만들어준다고 생각하면 된다
@propertyWrapper
struct Capitalize {
private var value: String = "" <- 여기에 초기값을 넣어주는것도 잊지말자
var wrappedValue: String {
get { return self.value}
set { self.value = newValue.capitalized}
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue
}
}
여기서 init으로 초기값을 지정해주는데 이부분을 꼭해주어야한다 그렇지 않을경우 String이 아닌 Capitalize라는 타입을 넣어달라는 에러가 뜰수있다
struct Address {
@Capitalize var town: String
}
var address = Address(town: "melbourne")
print(address.town)
address.town = "perth"
print(address.town)
struct Person {
@Capitalize var name: String
}
var person1 = Person(name: "taylor")
print(person1.name)
person1.name = "swift"
print(person1.name)
이렇게 해서 재사용 할수있는 코드를 만들었다