Swift 정리 - Methods

김세영·2021년 12월 20일
0

Swift Doc 정리

목록 보기
10/17
post-thumbnail

특정 타입의 클래스, 구조체, 열거형과 관련된 함수를 메서드라 한다.
인스턴스에서 실행할 수 있는 메서드를 인스턴스 메서드,
특정 타입과 관련된 메서드를 타입 메서드라 한다.

Instance Methods

특정 클래스, 구조체, 열거형의 인스턴스에 속한 메서드
인스턴스 메서드를 통해 인스턴스 내의 값을 제어하거나 변경할 수 있다.

class Counter {
    
    var count = 0
    
    func increment() { count += 1 }
    func increment(by amount: Int) { count += amount }
    func reset() { count = 0 }
}

let counter = Counter()
// counter.count : 0

counter.increment()
// counter.count : 1

counter.increment(by: 3)
// counter.count : 4

counter.reset()
// counter.count : 0

self

모든 인스턴스는 암시적으로 인스턴스 자체를 의미하는 self 프로퍼티를 가진다.

  • 인자 이름과 프로퍼티 이름이 같은 특수한 상황에서는 프로퍼티를 사용할 때 self를 명시해야 한다.
class ExampleClass {
    let someInt: Int
    let someString: String
    
    init(someInt: Int, _ someString: String) {
        self.someInt = someInt
        self.someString = someString
        // ----
        someString = someString // X, 둘 다 인자 이름으로 인식됨
    }
}

mutating

구조체와 열거형은 값 타입이기 때문에 인스턴스 메서드 내에서 값 타입의 프로퍼티를 변경할 수 없다.
이를 가능하게 하는 것이 mutating 키워드

  • mutating 키워드가 붙은 메서드는 메서드의 계산이 끝난 후
    원본 구조체에 그 결과를 덮어 쓰는 방식으로 값을 변경한다.
  • 구조체 혹은 열거형이 let으로 선언되어 있다면
    mutating 키워드와 상관 없이 값 변경이 불가능
struct SomeStruct {
    var someInt = 0
    
    // X
    // func changeSomeInt(by someInt: Int) {
    //     self.someInt = someInt
    // }
    
    // O
    mutating func changeSomeInt(by someInt: Int) {
        self.someInt = someInt
    }
}

var someVarStruct = SomeStruct()
someVarStruct.changeSomeInt(by: 10)
// someVarStruct.someInt : 10

let someLetStruct = SomeStruct()
someLetStruct.changeSomeInt(by: 10)
// X, someLetStruct이 let이므로 mutating 키워드를 썼더라도 변경 불가능

Assigning to self Within a Mutating Methods

mutating 메서드에서 self 프로퍼티를 사용해 새로운 인스턴스를 생성할 수 있다.

struct SomeStruct {
    var someInt = 0
    
    mutating func changeSomeInt(by someInt: Int) {
        self.someInt = someInt
    }
    // or
    mutating func changeSomeInt(by someInt: Int) {
        self = SomeStruct(someInt: someInt)
    }
}

Type Methods

특정 타입 자체에서 호출하여 사용하는 메서드.
static 혹은 class 키워드를 추가하여 선언할 수 있다.
static 키워드는 서브클래스에서 오버라이드 할 수 없고, class 키워드는 가능하다.

  • 타입 메서드 내에서의 self는 인스턴스가 아닌 타입 자체를 의미
class SomeClass {
    class func someClassMethod() { ... }
    static func someStaticMethod() { ... }
}

번외: @discardableResult

해당 키워드는 리턴값이 있는 메서드를 호출할 때 그 값을 사용하지 않아도 경고를 띄우지 않도록 해주는 키워드이다.

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글