[Swift 4.0] Methods

IOS/Swift 2017. 4. 1. 23:17

Introduction
: Class, Structure, Enumeration 모두 instance method, type method(class method)를 정의할 수 있다.


Instance Methods
: instance의 functionality를 담당한다. 

class Counter {

    var count = 0

    func increment() {

        count += 1

    }

    func increment(by amount: Int) {

        count += amount

    }

    func reset() {

        count = 0

    }

}


dot(.)을 통하여 instance method를 호출할 수 있다.

let counter = Counter()

// the initial counter value is 0

counter.increment()

// the counter's value is now 1

counter.increment(by: 5)

// the counter's value is now 6

counter.reset()

// the counter's value is now 0


The self Property
: 모든 instance는 "self"라는 property를 가지고 있다. "self"는 instance 자신이다. instance method 안에서 사용가능하며, 다른 instance method 호출이나 property에 접근할 때 사용한다. 

func increment() {

    self.count += 1

}


property에 접근할 때 property 앞에 무조건 "self"를 붙여줄 필요는 없지만, parameter 이름 또는 지역 변수 이름이 property 이름과 같은 경우 "self"를 property 앞에 붙여줘야 한다.

struct Point {

    var x = 0.0, y = 0.0

    func isToTheRightOf(x: Double) -> Bool {

        return self.x > x

    }

}

let somePoint = Point(x: 4.0, y: 5.0)

if somePoint.isToTheRightOf(x: 1.0) {

    print("This point is to the right of the line where x == 1.0")

}

// Prints "This point is to the right of the line where x == 1.0"


Modifying Value Types from Within Instance Methods
: Structure와 Enumeration은 Value type 이다. 그래서 기본적으로는 자신의 instance method 안에서 property 값을 변경할 수 없다. 변경이 가능하도록 하기 위해서는 property를 변경하는 instance method 앞에 "mutating" 이라는 키워드를 명시해야 한다. 


struct Point {

    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {

        x += deltaX

        y += deltaY

    }

}

var somePoint = Point(x: 1.0, y: 1.0)

somePoint.moveBy(x: 2.0, y: 3.0)

print("The point is now at (\(somePoint.x), \(somePoint.y))")

// Prints "The point is now at (3.0, 4.0)"


위 mutating method moveBy는 해당 instance를 let으로 선언하면 호출할 수 없다.

let fixedPoint = Point(x: 3.0, y: 3.0)

fixedPoint.moveBy(x: 2.0, y: 3.0)

// this will report an error


Assigning to self Within a Mutating Method
: mutating method는 instance 자신도 바꿀 수 있다.


struct Point {

    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {

        self = Point(x: x + deltaX, y: y + deltaY)

    }

}


structure 뿐만 아니라 Enumeration의 mutating method도 마찬가지다.

enum TriStateSwitch {

    case off, low, high

    mutating func next() {

        switch self {

        case .off:

            self = .low

        case .low:

            self = .high

        case .high:

            self = .off

        }

    }

}

var ovenLight = TriStateSwitch.low

ovenLight.next()

// ovenLight is now equal to .high

ovenLight.next()

// ovenLight is now equal to .off


Type Methods 
: Type Method는 다른 언어의 Class Method 라고 보면 된다.
선언 방법은 메서드 앞에 "static" 키워드를 붙이거나 "class" 키워드를 붙이면 된다. static method는 자식 클래스에서 override 하지 못하고, class method는 자식 클래스에서 override가 가능하다.

이 둘을 통틀어서 Type Method 라고 하는데, Type Method 안에서 참조하는 self는 instance가 아니라 Type 그 자체를 의미한다. 

class SomeClass {

    class func someTypeMethod() {

        // type method implementation goes here

    }

}

SomeClass.someTypeMethod()


* instance Method나 type Method안에서 다른 method를 호출할 때 또는 다른 property를 접근할 때 "self" 키워드를 앞에 안붙여도 된다. 
* Type Method와 Instance Method 이름을 같게해서 선언할 수 있다.
* Instance Method 안에서 Type Method를 호출할 때 또는 Type property를 접근할 때  타입이름을 앞에 붙어야 한다. 


'IOS > Swift' 카테고리의 다른 글

[Swift 4.0] Inheritance  (0) 2017.04.01
[Swift 4.0] Subscripts  (0) 2017.04.01
[Swift 4.0] Properties  (0) 2017.04.01
[Swift 4.0] Classes and Structures  (0) 2017.04.01
[Swift 4.0] Enumerations  (0) 2017.04.01
Posted by 홍성곤
,