Property Wrapper

고양이발냄새·2023년 8월 7일
0

Property Wrapper

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)

이렇게 해서 재사용 할수있는 코드를 만들었다

profile
고양이좋아

0개의 댓글

관련 채용 정보