ABOUT ME

-

Today
-
Yesterday
-
Total
-



  • importer 값이 DataImporter의 인스턴스 정보가 아닌, nil 을 가지고 있는 상태 => 호출하기 전에는 nil 로 초기화 된 상태네요^^


















  • 연산 프로퍼티 : get, set 키워드 : 실제로 값을 저장하는게 아니라 기존 값들로 연산된 값을 자동으로 제공하는 프로퍼티 ( 편리한거죠. )
        • 예를 들면서 설명하겠습니다!
        • 아래 예제에는 연산 프로퍼티의 사용법과 set 키워드에서 매개변수를 어떻게 생략할 수 있는지를 포함합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point() // 원점
    var size = Size()  // 크기
    var center: Point { // 중심점을 구하는 연산 프로퍼티
        get { // 저장된 값을 읽어올 때 사용하는 get
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) { 
        // center 프로퍼티에 새로운 값을 대입하면 origin.x , y 를 자동으로 변경시켜 준다.
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
        // (newCenter) 부분을 생략할 수 있다. 생략한다면 default 값 ( 기본 설정값 )은 'newValue' 이다.
        // 생략해서 작성하면 아래와 같다.
      /*set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }*/
        }
    }
}
var square = Rect(origin: Point(x: 0.0, y: 0.0), // Rect 구조체 초기화 된 인스턴스 square 에 저장.
                  size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center // 연산프로퍼티  center 호출. ( get )
print(initialSquareCenter) // center 는 현재 Point(x: 5.0, y: 5.0) 
square.center = Point(x: 15.0, y: 15.0// center 를 설정해 준다면 ( set )
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// center 를 15, 15 로 설정하고, width, height 는 모두 10 이므로 origin.x, y 는 10, 10 이 된다.
cs

        • 읽기 전용 ( Read - Only ) : get 키워드도 생략 가능
1
2
3
4
5
6
7
8
9
10
11
struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double { // 읽기 전용인 연산프로퍼티 : get 키워드도 붙일 필요가 없다.
        return width * height * depth
    }
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// Prints "the volume of fourByFiveByTwo is 40.0"
 
 
cs


  • 프로퍼티 옵저버 : willSet , didSet 키워드 : 프로퍼티 값의 변화를 감지하고 적당할 때 반응할 수 있는 기능. 
        • 프로퍼티의 값이 같은 값으로 저장되더라도, 저장되는 행위가 수행되면 무조건 프로퍼티 옵저버 실행된다.  => 기준점이 '저장' 인 것.
        • 저장 프로퍼티 에서 사용 가능하고, lazy 키워드가 붙은 프로퍼티는 불가. ( 연산프로퍼티의 set 과 같은 기능을 수행하기 때문에 연산프로퍼티 에는 필요가 없쥬? )
        • willSet 키워드가 붙은 블록{} : 값이 새로 저장되기 전에 호출된다. ( '저장' 이 기준이라고 위에 설명했쥬? )
        • didSet 키워드가 붙은 블록{} :  값이 새로 저장된  후에 호출된다.
        • 예를 들어 설명함!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class StepCounter {
    var totalSteps: Int = 0 { // 프로퍼티 옵저버 사용할 시 let 이 아닌 var 사용 
        willSet(newTotalSteps) { 
        // 프로퍼티 옵저버 willSet : 새로운 값이 저장되기 전에
        // 매개 변수가 default 가 아닌 ewTotalSteps 로 설정되었다. 
        // default 면 newValue 가 매개변수 로 자동 설정된다.
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
        // 프로퍼티 옵저버 didSet
        // 매개변수가 default 이므로 oldValue 로 자동 설정된다.
            if totalSteps > oldValue  { // default 값인 oldValue 사용한 코드.
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
cs



  • 타입 프로퍼티 : 타입 프로퍼티는 이 프로퍼티를 굳이 써야할 이유를 아직 명확히 경험적으로? 체득하지 못해서 .. ( 쓸 일이 없다는 말.. ) 깨달음이 올 때(?) 정리하겠습니다! 
        • 특정 타입이라 하면, 구조체, 클래스, 열거형 등을 정희하면, 그것이 여기서 말하는 타입이다. someClass 라는 구조체를 정의하고 그 구조체의 인스턴스를 생성하면, someClass 라는 타입의 인스턴스인 것.  그 타입의 여러 가지 생성된 각각의 인스턴스의 프로퍼티가 아니라, 그 타입 자체에 속한 프로퍼티를 정의할 수 있다.
        • 저는 뭐.. 이런게 있다 는 정도로 넘어갑니다~


'스위프트: Swift > 스위프트: 언어자체: 문법' 카테고리의 다른 글

Swift4 : 프로토콜 2 : #델리게이트 패턴 : #델리게이션 (2 / 2)  (0) 2018.09.07
Swift4 : 프로토콜 1 : #Protocol : #설계 : #요구사항 : #델리게이션 : #델리게이트 패턴 ( 1 / 2 )  (0) 2018.09.07
Swift4 :메소드 : Method : #메소드의 범위 : #mutating : #self #값 타입 수정  (0) 2018.09.06
Swift4 : 클래스와 구조체 : #값을 대하는 방식 : #값 타입, 참조 타입 : #value type : #reference type : #=== 연산자  (0) 2018.09.05
Swift4: 제어 전송 명령문( Control transfer statement ) : continue, break, return  (0) 2018.09.04

댓글