Protocol
프로토콜은 지켜야 할 약속, 꼭 구현되어야 할 메소드나 프로퍼티의 목록이다.
예를 들면 어느 서비스를 구현할 때 꼭 구현해야할 기능들의 목록이라고 볼 수 있다. (인터페이스 같다. 하지만 인터페이스와 똑같진 않다. 나중에 이부분에 대해서 따로 정리하도록 하자)
프로토콜은 다음과 같이 구현한다.
public protocol CustomStringConvertible {
public var description: String { get }
}
실제로 프로토콜을 구현하는 것을 Confirming이라고 부른다.
Property
오브젝트의 데이터 영역을 프로퍼티라고 부른다. (오브젝트 = 데이터 + 메소드)
Swift에서 프로퍼티는 두가지 종류로 나눌 수 있다.
- Instance Property: 인스턴스를 생성하여 접근할 수 있는 프로퍼티
- Stored Property: 값을 저장하고 있는 프로퍼티
- Computed Property: 저장된 값을 가공 혹은 계산하여 반환하는 프로퍼티
- Type Property: 인스턴스를 생성하지 않고, Struct or Class의 타입 자체를 정하고 싶을 때 사용한다.
Instance Property
Computed Property의 경우 var 키워드로만 선언할 수 있다. (let은 안된다!!) 그리고 computed property는 기본적으로 read-only이므로 값을 직접 업데이트 할 수 없다. 하지만 getter, setter를 이용하면 computed property가 이용하고 있는 stored property의 값을 업데이트 할 수도 있다. 다음 예제 코드를 보자.
struct Person {
var firstName: String
var lastName: String
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set{
// newValue "Jay Park"
if let firstName = newValue.components(separatedBy: " ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy: " ").last {
self.firstName = lastName
}
}
}
}
var person = Person(firstName: "dew", lastName: "Lee")
person.firstName // dew
person.lastName // Lee
person.fullName = "Jay Park"
person.firstName // Jay
person.lastName //Park
Person struct에 fullName이란 computed property는 getter, setter를 통해 Person struct의 stored property의 값을 업데이트 하고 있다. 이렇게 getter, setter를 지정하지 않고는 computed property에 '=' 연산을 이용하여 값을 업데이트 시킬 수 없다.
Type Property
Type property는 생성된 인스턴스에 상관없이 struct, class의 타입 자체를 정하고 싶을 때 사용한다.
struct Person {
var firstName: String
var lastName: String
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set{
// newValue "Jay Park"
if let firstName = newValue.components(separatedBy: " ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy: " ").last {
self.firstName = lastName
}
}
}
static let isAlien: Bool = false
}
이렇게 static으로 정의한 Type property는 인스턴스를 생성하지 않고도 Struct, Class 타입 그자체로 접근할 수 있다.
Person.isAlien
didSet{}, willSet{}
Stored property는 변경된 값을 추적할 수 있다. 즉 과거의 값을 알 수 있다는 것이다!
didSet{ }을 사용하면 바뀌는 값을 observing 할 수 있다. 값이 바뀌고 나서 didSet이 호출된다.
var firstName: String {
didSet {
print("didSet: \(oldValue) -> \(firstName)")
}
}
willSet{} 또한 바뀌는 값을 observing한다. didSet보다 먼저 호출된다.
var firstName: String {
willSet {
print("willSet: \(firstName) -> \(newValue)")
}
didSet {
print("didSet: \(oldValue) -> \(firstName)")
}
}
Stored Property만 willSet, didSet을 호출할 수 있다.
lazy property
lazy Property는 해당 프로퍼티가 접근될 때 initialize가 된다. 엔지니어링 측면에서 optimizing할 때 사용한다. 나름의 cost가 드는 것들은 초기화 되는 것을 최대한 미뤄서 사용자가 실제로 사용할 때 초기화 되도록 하는 것이다.
lazy var isPopular: Bool = {
if fullName == "Dew Lee" {
return true
} else {
return false
}
}()
보통 다른 프로퍼티는 인스턴스가 생성될 때 코드가 수행되고 초기화 되지만, lazy 프로퍼티는 사용자가 실제로 호출할 때 코드가 최초로 실행된다!
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'iOS > iOS 앱 개발 올인원 패키지 Online' 카테고리의 다른 글
[iOS] 패스트캠퍼스 챌린지 20일차 - Structure(5). Extension (0) | 2021.09.25 |
---|---|
[iOS] 패스트캠퍼스 챌린지 19일차 - Structure(4).Property vs. Method (0) | 2021.09.24 |
[iOS] 패스트캠퍼스 챌린지 17일차 - Structure(2).예제 (0) | 2021.09.22 |
[iOS] 패스트캠퍼스 챌린지 16일차 - Structure(1). Structure vs. Class (0) | 2021.09.21 |
[iOS] 패스트캠퍼스 챌린지 15일차 - Closure(2) (0) | 2021.09.20 |