본문 바로가기
모바일앱/Swift

프로퍼티 개념

by GeekCode 2021. 10. 13.
반응형

#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