특정 타입의 클래스, 구조체, 열거형과 관련된 함수를 메서드라 한다.
인스턴스에서 실행할 수 있는 메서드를 인스턴스 메서드,
특정 타입과 관련된 메서드를 타입 메서드라 한다.
특정 클래스, 구조체, 열거형의 인스턴스에 속한 메서드
인스턴스 메서드를 통해 인스턴스 내의 값을 제어하거나 변경할 수 있다.
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 키워드를 썼더라도 변경 불가능
self
Within a Mutating Methodsmutating
메서드에서 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)
}
}
특정 타입 자체에서 호출하여 사용하는 메서드.
static
혹은 class
키워드를 추가하여 선언할 수 있다.
static
키워드는 서브클래스에서 오버라이드 할 수 없고, class
키워드는 가능하다.
self
는 인스턴스가 아닌 타입 자체를 의미class SomeClass {
class func someClassMethod() { ... }
static func someStaticMethod() { ... }
}
번외:
@discardableResult
해당 키워드는 리턴값이 있는 메서드를 호출할 때 그 값을 사용하지 않아도 경고를 띄우지 않도록 해주는 키워드이다.