하루에 0.01%라도 성장하자

Develop/iOS

Swift 프로퍼티 (Property)

뚠님 2019. 5. 9. 18:08
반응형

Swift

 

프로퍼티의 종류

 

  • 인스턴스 저장 프로퍼티
  • 타입 저장 프로퍼티
  • 인스턴스 연산 프로퍼티
  • 타입 연산 프로퍼티
  • 지연 저장 프로퍼티
프로퍼티의 정의

 

  • 연산 프로퍼티는 var로만 선언할 수 있다. ( 연산인데 상수로 선언 하는게 이상하긴 함..; )
  • 연산 프로퍼티는 읽기전용으로는 구현할 수 있지만 쓰기전용으로는 구현할 수 없음.
  • set블럭에서는 암시적으로 newValue를 사용할 수 있다.

 

코드로 공부하자!

 

struct SampleStruct{
    // 인스턴스 저장 프로퍼티
    var name : String = "뚠님";
    var age : Int = 10;


    // 인스턴스 연산 프로퍼티
    var anotherAge : Int {
        get { // 호출했을 때 실행되는 구문. get으로 선언한다.
            return age - 1;
        }

        set(inputAge) { // 호출됬을 때 실행되는 구문. set으로 선언한다.
            age = inputAge -1;
        }
    }
    
    var anotherAge2 : Int {
        get { // 호출했을 때 실행되는 구문. get으로 선언한다.
            return age - 1;
        }

        set { // 호출됬을 때 실행되는 구문. set으로 선언한다.
            age = newValue -1; // set에 별도의 인자가 없으면 newValue를 이용해서 사용할 수 있음.
        }
    }


    // 타입 저장 프로퍼티
    static var typeValue : String = "타입 프로퍼티";

    //읽기 타입 인스턴스 연산 프로퍼티
    //읽기전용 인스턴스 연산 프로퍼티는 있으나 쓰기전용은 없다.
    // get만 있거나 get, set이 같이 있거나.
    var readProperty : String {
        get {
            return "나는 읽기전용 입니다앙";
        }
    }
}

//읽기 전용에서는 get을 생략할 수 있다.
var readProperty2 : String {
    return "나는 읽기전용2 입니다";
}


//사용하기
print(SampleStruct.typeValue); // 타입 프로퍼티

//읽기전용 인스턴스 연산 프로퍼티 사용.
var tempStruct : SampleStruct = SampleStruct();
print(tempStruct.readProperty());

//인스턴스 저장 프로퍼티 사용
tempStruct.name = "뚜운님";


//anotherAge 인스턴스 연산 프로퍼티 사용
print("\(tempStruct.name)의 나이는 \(tempStruct.anotherAge) 입니당.");

 


 

프로퍼티 감시자

 

willSet, didSet으로 변경되기 전과 변경된 후에 처리를 할 수 있다.

 

var currentNum : Int  = 100 {
    willSet(newValue){ // 변경될 값 == newValue
    	print("현재 값 \(currentNum) 에서 새로운 값 \(newValue)로 변경된다");
    }
    
    didSet(oldValue){ // 변경된 값  == oldValue
        print("예전 값 \(oldValue)에서 \(currentNum)으로 변경되었다.");
    }
}

var currentNum : Int  = 100 {
    willSet { // 매개변수가 생략되어도 사용 가능하다.
    	print("현재 값 \(currentNum) 에서 새로운 값 \(newValue)로 변경된다");
    }
    
    didSet { // 매개변수가 생략되어도 사용 가능하다.
        print("예전 값 \(oldValue)에서 \(currentNum)으로 변경되었다.");
    }
}


 

확실히 실력없는 솜씨로 글을 쓰면서 설명하기 보다는 코드를 작성하고 주석으로 작은 설명을 하는게 더 좋은거 같다...

 

반응형