IOS/Swift

[TIL] Swift. Method

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 키워드를 두어서 사용합니다.

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()

https://zeddios.tistory.com/258 참조

'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