- Method 란, 특정 타입과 관련된 함수 function 를 의미함
- 클래스, 구조체, 열거형 모두 Instance Method 를 정의할 수 있음
- 또한 Type Method 도 정의할 수 있음
- Instance Method : 해당 타입의 instance 내에서 특정 작업과 기능을 하는 함수
- Type Method : Type 자체와 연관된 함수. Objective-C 에서의 class method 와 유사함
- Swift 의 구조체와 열거형에서 method 를 정의할 수 있다는 것은 C와 Objective-C 와의 아주 큰 차이임
- C와 Objective-C 에서는 클래스가 함수를 정의할 수 있는 유일한 타입임
Instance Method
특정 클래스, 구조체, 열거형의 인스턴스에 속하는 함수
인스턴스 프로퍼티에 접근하고 수정하는 방법을 제공하거나
인스턴스의 목적과 관련된 기능을 제공
→ 인스턴스의 기능성을 제공함
Functions 와 완전히 동일한 syntax 를 가짐
- Instance method 는 그 타입의 모든 다른 instance method 및 프로퍼티에 접근가능함
- Instance method 는 그것이 속한 타입의 instance 가 있어야만 호출될 수 있음
Counter class 예제
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
프로퍼티와 마찬가지로 . (dot syntax) 을 사용하여 instance method 를 호출할 수 있음
let counter = Counter()
counter.increment()
counter.increment(by: 5)
counter.reset()
함수(function)의 파라미터는 name(함수 내부에서 사용되는 이름)과 argument label(함수 호출 시 사용되는 이름) 모두 사용 가능
→ method parameters 와 완전히 동일!
The self Property
- 모든 타입의 Property 는 self(=property 자신과 동일한 의미)라 불리는 암묵적인 property 를 갖고 있음
- 이것은 자신의 instance method 내에서 현재 instance를 가리키는데 사용
- 위의 increment() method 는 아래 코드와 같이 작성될 수 있음
func increment() {
self.count += 1
}
하지만 실제로는 self 를 자주 사용할 필요는 없음
→ swift 가 추론하기 때문임
self 를 사용해야하는 예외적인 경우는 method parameter와 instance 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")
}
→ 이런 상황에서 self 를 사용하지 않는다면, swift 는 두 가지 사용 방식(여기서는 self.x 와 x 에 사용된 x 를 의미) 모두 method parameter 로 추론할 것임
Modifying Value Types from Within Instance Methods
구조체 Structure 와 열거형 Enumeration 은 value type 임
기본적으로 value type (값 타입) 의 프로퍼티는 instance method 안에서 수정될 수 없음
하지만 구조체/열거형의 특정 함수 내에서 어떤 프로퍼티 값을 수정하고 싶다면 해당 method 에 대한 동작을 변경하도록 선택할 수 있음
→ 1. method 내에서 프로퍼티를 변경할 수 있게 됨
→ 2. 또한 self 프로퍼티에 완전히 새로운 instance 를 할당할 수도 있음
→ 기존 값을 새로운 instance 가 대체하게 됨
이 동작은 func 키워드 앞에 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))")
→ 이 메서드는 새 point 를 반환하는 대신 실제로 호출된 point 를 수정함
→ mutating 키워드는 프로퍼티를 수정 가능하도록 정의함
하지만 구조체를 상수로 선언한다면 mutating method 를 사용할 수 없음
→ 이것의 프로퍼티들이 변경될 수 없기 때문
→ 이 프로퍼티가 변수일지라도 변경될 수 없음
→ Stored Properties of Constant Structure Instances 참고
let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0) // -> ERROR
Assigning to self Within a Mutating Method
Mutating method 는 self property 에 완전히 새로운 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)
}
}
→ mutating moveBy(x: y: ) method 는 새롭게 설정된 x, y 값으로 새 구조체를 생성함
→ 이 방식의 method 를 호출한 최종 결과는 이전 버전을 호출할 때와 정확히 동일함
열거형에서의 mutating method 는 self parameter를 동일한 열거형의 다른 case 로 설정할 수 있음
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()
// -> .high
ovenLight.next()
// -> .off
> 2021. 12. 13 업데이트
'# iOS | Swift > --- 공식 문서' 카테고리의 다른 글
iOS CoreLocation__ 위치 서비스 사용하기 (0) | 2022.07.05 |
---|---|
UITableView 편집 모드와 관련된 속성들 (0) | 2022.02.03 |
[Article] Choosing Between Structures and Classes (0) | 2021.12.27 |