반응형
#StoredProperty #ComputedProperty #instanceProperty #TypeProperty #willSet #didSet #lazyProperty
앞서서 우리는 Structure를 배웠는데 관계된 것들을 묶는 것을 말한다.
그리고 오브젝트도 관계된 것들을 묶어준 것이라고 언급한 적이 있다.
Object = Data + Method
스트럭쳐를 구현하면서 데이터와 메서드를 만들었다.
우리가 예전에 풀었던 내용을 보면 이런 구조로 되어있다.
struct Store {
//-------> 데이터 파트
let loc: Location
let name: String
let deliveryRange = 2.0
//-------> 메소드 파트
//배달가능한지보는 함수
func isDeliverable(userLoc: Location) -> Bool {
let distanceToStore = distance(current: userLoc, target: loc)
return distanceToStore < deliveryRange
}
}
데이터 파트는 스위프트에서 Properties라고 말한다.
저장된 프로퍼티의 형태로도 있을 수 있고
descrption처럼 직접저장하진않고 그것을 이용해서 가공된 것 같은 경우는 Computed Property라고 한다.
// Stored Property
let loc: Location
let name: String
let deliveryRange = 2.0
// CustomStringConvertible ---> Computed Property
struct Lecture: CustomStringConvertible {
var description: String {
return "Title: \(name), instructor: \(instructor)"
}
let name: String
let instructor: String
let numOfStudent: Int
}
1. Stored Property : 데이터를 저장하는 프로퍼티
2. Computed Property : 가공된 값을 만드는 프로퍼티
* 인스턴스의 값을 나타내는 인스턴스 프로퍼티
* 타입 프로퍼티 : type Property -> 생성된 인스턴스에 상관없이 스트럭트의 타입 혹은 클래스의 타입 자체에 속성을 만들고 싶을때 사용
import SwiftUI
//1. 인스턴스 프로퍼티
struct Person{
//Stored property ---> 데이터를 저장하는 프로퍼티
var firstName: String
var lastName: String
//Computed property ---> 가공된 값을 만드는 프로퍼티
var fullName: String{
return "\(firstName) \(lastName)"
}
}
//실무에서는 let 으로 하는 것을 선호한다.
var person = Person(firstName: "Jason", lastName: "Lee")
person.firstName
person.lastName
person.firstName = "Jin"
person.lastName = "Kim"
person.firstName //"Jin"
person.lastName //"Kim"
person.fullName //"Jin Kim"
//아래 처럼 세팅도 가능
struct Person{
//Stored property
var firstName: String
var lastName: String
//Computed property
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set {
// newValue "Jay Park" -> 빈칸을 기준으로 String을 자를 수 있다.
if let firstName = newValue.components(separatedBy:" ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy:" ").last {
self.lastName = lastName
}
}
}
}
person.fullName = "Jay Park"
person.firstName
person.lastName
//2. 타입 프로퍼티
//type Property -> 생성된 인스턴스에 상관없이 스트럭트의 타입 혹은 클래스의 타입 자체에 속성을 만들고 싶을때 사용
//아래 처럼 세팅도 가능
struct Person{
//Stored property
var firstName: String
var lastName: String
//Computed property
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set {
// newValue "Jay Park" -> 빈칸을 기준으로 String을 자를 수 있다.
if let firstName = newValue.components(separatedBy:" ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy:" ").last {
self.lastName = lastName
}
}
}
// type property
static let isAlien: Bool = false
}
// 인스턴스가 아니라 타입 자체의 프로퍼티
Person.isAlien //false
willset
didset
lazy property 최적화를 위해 사용 이니셜 밸류를 생성할 때,
-> 처음부터 모두가 필요 없을때, 나중에 필요한 사람만 사용하는 상황에 사용
lazy var code: Bool
//3. will Set Get Set
//아래 처럼 세팅도 가능
struct Person{
//Stored property
var firstName: String {
willSet {
print("willSet: \(firstName)---> \(newValue)")
}
didSet {
print("didSet: \(oldValue)---> \(firstName)")
}
}
var lastName: String
//Computed property
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set {
// newValue "Jay Park" -> 빈칸을 기준으로 String을 자를 수 있다.
if let firstName = newValue.components(separatedBy:" ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy:" ").last {
self.lastName = lastName
}
}
}
// type property
static let isAlien: Bool = false
}
// 인스턴스가 아니라 타입 자체의 프로퍼티
Person.isAlien //false
var person = Person(firstName: "Jason", lastName: "Lee")
person.firstName
person.lastName
person.firstName = "Jason"
person.lastName = "Kim"
person.firstName //"Jin"
person.lastName //"Kim"
person.fullName //"Jin Kim"
// will set은 바뀌기전 didSet은 바뀐후 보여준다.
//willSet: Jason---> Jin
//didSet: Jason---> Jin
//willSet: Jin---> Jason
//didSet: Jin---> Jason
//4. lazy Property
//아래 처럼 세팅도 가능
struct Person{
//Stored property
var firstName: String {
willSet {
print("willSet: \(firstName)---> \(newValue)")
}
didSet {
print("didSet: \(oldValue)---> \(firstName)")
}
}
var lastName: String
lazy var isPopular: Bool = {
if fullName == "Jay Park" {
return true
} else {
return false
}
}()
//Computed property
var fullName: String {
get{
return "\(firstName) \(lastName)"
}
set {
// newValue "Jay Park" -> 빈칸을 기준으로 String을 자를 수 있다.
if let firstName = newValue.components(separatedBy:" ").first {
self.firstName = firstName
}
if let lastName = newValue.components(separatedBy:" ").last {
self.lastName = lastName
}
}
}
// type property
static let isAlien: Bool = false
}
// 인스턴스가 아니라 타입 자체의 프로퍼티
Person.isAlien //false
var person = Person(firstName: "Jason", lastName: "Lee")
person.firstName
person.lastName
person.firstName = "Jason"
person.lastName = "Kim"
person.firstName //"Jin"
person.lastName //"Kim"
person.fullName //"Jin Kim"
// will set은 바뀌기전 didSet은 바뀐후 보여준다.
//willSet: Jason---> Jin
//didSet: Jason---> Jin
//willSet: Jin---> Jason
//didSet: Jin---> Jason
person.isPopular //false
person.fullName = "Jay Park"
person.isPopular //true
반응형
'모바일앱 > Swift' 카테고리의 다른 글
상속 개념을 코드로 익히기 (0) | 2021.10.18 |
---|---|
클래스, 언제 클래스? 언제 스트럭트? (0) | 2021.10.16 |
메소드 개념 ( + extension) (0) | 2021.10.14 |
프로퍼티 vs 메소드 (0) | 2021.10.14 |
프로토콜 (0) | 2021.10.13 |
Struct만들기 도전과제 (0) | 2021.10.12 |
구조체와 클래스의 차이점 (0) | 2021.10.11 |
Collection - Closure, Capturing Values (0) | 2021.10.10 |