1. 개념
- 메소드는 특정 타입과 연관된 함수입니다
- 클랫, 구조체 및 열거형은 특정 작업이나 기능을 캡슐화한 인스턴스 메소드와 타입 자체와 관련된 타입메소드를 정의 할 수 있습니다.
- 타입 메소드는 Objective-C의 클래스 메소드와 비슷합니다.
- Swift에서 구조체와 열거형을 정의할 수 있다는 사실은 C와 objective-C와의 주요한 차이점 입니다.
- Objective-C에서 클래스는 메소드를 정의할 수 있는 유일한 타입입니다.
- Swift에서는 클래스, 구조체 또는 열거형을 정의하는 여부를 선택할 수 있으며, 사용자가 만든 타입에 대한 메소드를 유연하게 정의 할 수 있습니다.
2. Instance Methods인스턴스 메소드는 특정 클래스, 구조체 또는 열거형의 인스턴스에 속하는 함수입니다.
-
인스턴스 프로퍼티의 접근 및 수정 방법을 제공하거나 인스턴스 목적과 관련된 기능을 제공하여 해당 인스턴의기능을 지원합니다.
-
인스턴스 메소드는 함수에서 설명한대로 함수와 완전히 동일한 구문을 사용합니다
-
인스턴스 메소드가 속한 타입의 여는 중괄호({})안에 인스턴스 메소드를 작성합니다
-
인스턴스 메소드는 자신이 속한 타입의 특정 인스턴스에서만 호출 될 수 있습니다
-
기존의 인스턴스가 없으면, 호출 할 수 없습니다
class Counter {
var count = 0
func increment() {
count += 1
}
func increment(by amount: Int) {
count += amount
}
func reset() {
count = 0
}
}
지금의 Counter라는 클래스에는 3가지 인스턴스 메소드를 정의하고 있습니다.
increment()는 카운터를 1씩 증가시킵니다
increment(By:Int)는 지정된 정수만큼 카운터를 증가시킵니다
reset()는 카운터를 0으로 재설정합니다
그리고 현재의 카운터 값을 담기위해 count라는 변수를 선언(stored property)한 것을 볼수 있습니다.
다른 프로퍼티와 마찬가지로 .(dot)을 통해 인스턴스 메소드를 호출 할 수있습니다
let counter = Counter()// count = 0 (기본값)
counter.increment()//count = 1
counter.increment(by: 5)//count = 6
counter.reset()//count = 0
3. The Self Property
-
타입의 모든 인스턴스에서는 "Self"라는 암시적(implicit) 프로퍼티를 가집니다. 이는 인스턴스 자신과 정확하게 동일합니다. self프로퍼티를 사용하여 자체 인스턴스 메소드 내에서 현재 인스턴스를 참조할 수 있습니다. // ex:) func increment() { self.count += 1 }
-
실제로는 코드에 self를 생략할수 있습니다 명시적으로 self를 작성하지 않으면 메소드 내에서 알려진 프로퍼티 또는 메소드 이름을 사용할 때마다, 현재 인스턴스 프로퍼티 또는 메소드를 참조한다고 가정합니다.
-
이 가정은 Counter클래스의 세가지 메소드 내에서 count를 사용하는 것을 보면 증명할수 있습니다.
-
단. 이 규칙의 예외사항은 인스턴스 메소드의 매개변수 이름이 해당 인스턴스 프로퍼티와 동일한 이름을 가질때 발생합니다. 이 경우 매개변수 이름이 우선 적용됩니다. 따라서 self프로퍼티를 사용해야 합니다.
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOf(x: Double) -> Bool {
return self.x > x
}
}
4. Modifying Value Types from Within Instance Methods
-
기본적으로 Value Type의 프로퍼티들은 해당 인스턴스 메소드 내에서 수정할 수 없습니다. 그러나 특정 메소드 내에서 구조체 또는 열거형의 프로퍼티를 수정해야 하는경우, 해당 메소드의 동장을 변경(Mutating)하도록 선택 할 수 있습니다
-
메소드는 메소드 내에서 프로퍼티를 변경할 수 있으며, 메소드가 끝나면 변경된 내용이 원래 구조체에 다시 기록됩니다.
- var를 사용하여 선언해야 가능합니다.
func 키워드 앞에 mutating 키워드를 두어서 사용합니다.
- var를 사용하여 선언해야 가능합니다.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
// self = Point(x: x + deltaX, y: y + deltaY)
// 위의 x , y 를 // self코드와 같이 작성할수 있다.
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
5. Assigning to self Within a Mutating Method
-
Mutating 메소드는 암시적(implicit) self 프로퍼티에 완전히 새로운 인스턴스를 할당 할 수 있습니다.
-
사용된 mutating이 인스턴스 메소드 내의 프로퍼티를 바꿀수 있게 한다.
-
ovenLight.next() 은 위의 케이스를 순환한다.
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 == .high
ovenLight.next() // ovenLight == .off
6. Type Method
- func 키워드 앞에 static 키워드를 붙여 사용합니다
- 클래스는 class키워드를 사용하여 하위 클래스가 슈퍼클래스의 해당 메소드 구현을 재정의(override)할수 있도록 허용할수 있습니다
class Hyeongyu:SomeClass{
override static func someTypeMethod(){
// code
}
}
- Objective-C 에서는 Objective-C 클래스에 대해서만 타입레벨 메소드를 정의할 수 있습니다
- Swift에서는 모든 클래스, 구조 및 열거형에 대해 타입레벨 메소드를 정의 할 수 있습니다.
- 타입 메서드는 인스턴스 메소드처럼 .(dot)으로 호출됩니다
- 그러나. 인스턴스로 메서드를 호출하는게 아니라 타입으로 호출됩니다
- @discardableResult // 옐로우 워닝을 없앨수 있는 방법
- 클래스형 타입 메서드와 스태틱 타입 메서드
class SomeClass {
static func otherTypeMethod(){
//code
}
class func someTypeMethod() {
// code
}
// 클래스형은 재정의 가능하다. override 키워드 사용
}
SomeClass.someTypeMethod()
SomeClass.otherTypeMethod()
'IOS > Swift' 카테고리의 다른 글
[TIL] Swift. Class 2편 (0) | 2020.10.07 |
---|---|
[TIL] Swift. Class 1편 (0) | 2020.10.07 |
[TIL] Swift. Property (0) | 2020.10.01 |
[TIL] Swift. Structure(Class, Struct, Enum) (0) | 2020.09.30 |
[TIL] Swift. Function Expression (0) | 2020.09.29 |