메소드는 특정 타입과 연관된 함수다. 클래스, 구조체, 열거형의 인스턴스 메소드는 그 인스터스 내에서 작동하는 함수 기능을 제공하고, 타입 메소드는 타입 그 자체와 관련 있다.
구조체와 열거형에서도 메소드를 정의할 수 있다는 게 스위프트의 특징.
인스턴스 내부 함수라고 할 수 있다. 인스터스 프로퍼티 값을 수정하거나 접근하는 등 인스턴스를 사용할 때 주로 호출된다. 지금 있는 인스턴스를 만들지 않고 개별적으로 인스턴스 메소드만 따로 사용할 수는 없다.
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
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
Counter
클래스로 만든 인스턴스는 count
변수 값 0으로 초기화되어 있고, 각 메소드를 사용할 때마다 값이 바뀐다.
인스턴스는 셀프 self
를 통해 인스턴스 객체 자기 자신을 가리킬 수 있다. 인스턴스 메소드를 사용할 때 이 인스턴스 내부의 값을 접근할 때 셀프를 활용한다.
func increment() {
self.count += 1
}
셀프를 쓰지 않아도 스위프트 컴파일러는 자동으로 인스턴스 내 이미 선언된 프로퍼티를 사용하면 셀프의 프로퍼티임이 추론된다.
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"
메소드 프로퍼티와 인스턴스 프로퍼티를 같이 사용 가능.somePoint
의 셀프 프로퍼티 x
와 메소드를 사용할 때 넘겨준 프로퍼티 x
값을 비교한다.
구조체와 열거형은 값 타입이기 때문에 기본적으로는 값 타입의 프로퍼티는 인스턴스 메소드 상에서는 변경할 수 없다. 하지만 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)"
mobeBy
메소드는 mutating
키워드로 선언했기 때문에 값 타입 프로퍼티를 변경할 수 있다.
물론 상수로 선언한 구조체 인스턴스의 프로퍼티는 mutating
키워드를 붙인다고 하더라도 바꿀 수 없다.
let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0)
// this will report an error
뮤테이팅 메소드를 사용해서 새로운 인스턴스를 셀프 프로퍼티에 할당할 수 있다.
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)
}
}
뮤테이팅 메소드로 선언된 moveBy
는 파라미터로 받은 값을 기존 셀프 프로퍼티의 값으로 만든 인스턴스를 셀프로 넘겨준다.
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
next()
뮤테이팅 메소드를 통해 셀프 프로퍼티를 열거 케이스로 확인해 다른 케이스로 넘긴 케이스가 곧 다시 인스턴스가 된다.