English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift 메서드

Swift 메서드는 특정 타입과 연관된 함수입니다

Objective-C에서는 클래스만 메서드를 정의할 수 있는 유일한 타입입니다. 하지만 Swift에서는 클래스를 정의할지 여부를 선택할 수 있습니다./구조체/열거형, 그리고 생성한 타입(클래스/구조체/열거형에 메서드를 정의합니다.

예제 메서드

Swift 언어에서 예제 메서드는 특정 클래스, 구조체 또는 열거형 타입 예제에 속합니다.

예제 메서드는 다음과 같은 메서드를 제공합니다:

  • 예제 속성을 접근하고 수정할 수 있습니다

  • 예제 목적과 관련된 기능을 제공합니다

예제 메서드는 소속 타입의 전후 대括호({}) 사이에 작성되어야 합니다.

예제 메서드는 소속 타입의 모든 다른 예제 메서드와 속성을 암시적으로 접근할 수 있습니다.

예제 메서드는 그 소속 클래스의 특정 예제만이 호출할 수 있습니다.

예제 메서드는 기존 예제에서는 호출할 수 없습니다.

문법

func funcname(매개변수) -> 반환형
{
    문장1
    문장2
    ……
    문장 N
    return 매개변수
}

온라인 예제

import Cocoa
class Counter {
    var count = 0
    func increment() {
        count +}} 1
    }
    func incrementBy(amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}
// 초기 카운터 값은 0입니다
let counter = Counter()
// 카운터 값은 지금1
counter.increment()
// 카운터 값은 지금6
counter.incrementBy(amount: 5)
print(counter.count)
// 카운터 값은 지금 0입니다
counter.reset()
print(counter.count)

위 프로그램 실행 출력 결과는 다음과 같습니다:

6
0

Counter 클래스는 세 가지 예제 메서드를 정의합니다:

  • increment 카운터를 1 증가;
  • incrementBy(amount: Int) 지정된 정수 값을 기준으로 카운터를 증가시킵니다;
  • reset 카운터를 0으로 재설정합니다.

Counter 이 클래스는 또한 변경 가능한 속성을 선언합니다 count로 현재 카운터 값을 추적할 수 있습니다.

메서드의 로컬 파라미터 이름과 외부 파라미터 이름

Swift 함수 파라미터는 동시에 로컬 이름(함수 내에서 사용)과 외부 이름(함수 호출 시 사용)을 가질 수 있습니다.

Swift의 메서드와 Objective-C의 메서드는 Objective-C와 마찬가지로, Swift의 메서드 이름은 일반적으로 대명사를 사용하여 첫 번째 파라미터를 가리킵니다. 예를 들어: with, for, by 등.

Swift는 기본적으로 메서드의 첫 번째 파라미터에만 로컬 파라미터 이름을 제공하며, 기본적으로 두 번째와 이후의 파라미터에 전역 파라미터 이름을 제공합니다.

다음 예제에서 '아니요1는 Swift에서는 전역 파라미터 이름으로 선언됩니다.'아니요2는 전역 선언에 사용되며 외부 프로그램으로 접근할 수 있습니다.

import Cocoa
class division {
    var count: Int = 0
    func incrementBy(아니요1: Int, 아니요2: Int) {
        count = 아니요1 / 아니요2
        print(count)
    }
}
let counter = division()
counter.incrementBy(아니요1: 1800, no2: 3)
counter.incrementBy(아니요1: 1600, no2: 5)
counter.incrementBy(아니요1: 11000, no2: 3)

위 프로그램 실행 출력 결과는 다음과 같습니다:

600
320
3666

외부 이름 제공 여부 설정

우리는 첫 번째 파라미터에 외부 이름을 추가하여 이 로컬 이름을 외부 이름으로 사용합니다(Swift 2.0 앞에는 # 기호를 사용합니다).

반대로, 우리는 다음 파라미터 이상의 파라미터에 이름을 제공하지 않는 외부 이름을 설정할 수 있는 밑줄(_를 사용할 수 있습니다.

import Cocoa
class multiplication {
    var count: Int = 0
    func incrementBy(first 아니요1: Int, 아니요2: Int) {
        count = 아니요1 * 아니요2
        print(count)
    }
}
let counter = multiplication()
0, no 800, no2: 3)
0, no 100, no2: 5)
0, no 15000, no2: 3)

위 프로그램 실행 출력 결과는 다음과 같습니다:

2400
500
45000

self 속성

각 예제는 은닉 속성 self을 가지며, self은 예제 자체와 동일합니다.

예제의 예제 메서드에서 은닉 속성 self를 사용하여 현재 예제를 참조할 수 있습니다.

import Cocoa
class 계산 {
    let a: Int
    let b: Int
    let res: Int
    init(a: Int, b: Int) {
        self.a = a
        self.b = b
        res = a + b
        print("Self 내: \(res)")
    }
    func tot(c: Int) -> Int {
        return res - c
    }
    func result() {
        print("결과는: \(tot(c: 20))
        print("결과는: \(tot(c: 50))
    }
}
let pri = 계산(a: 600, b: 300)
let sum = 계산(a: 1200, b: 300)
pri.result()
sum.result()

위 프로그램 실행 출력 결과는 다음과 같습니다:

Self 내: 900
Self 내: 1500
결과는: 880
결과는: 850
결과는: 1480
결과는: 1450

값 타입에서 예제 메서드에서 변경

Swift 언어에서 구조체와 열거형은 값 타입입니다. 일반적으로 값 타입의 속성은 예제 메서드에서 변경할 수 없습니다.

하지만, 구조체나 열거형의 속성을 특정 메서드에서 실제로 변경해야 한다면, 변경 가능(mutating) 메서드를 선택할 수 있으며, 이 메서드는 메서드 내부에서 속성을 변경할 수 있습니다; 그리고 변경은 메서드가 끝나면 원래 구조체에 유지됩니다.

메서드는 은닉 속성 self에 새로운 예제를 할당할 수 있으며, 이 새로운 예제는 메서드가 끝나면 원래 예제를 대체합니다.

import Cocoa
struct 면적 {
    var 길이 = 1
    var 너비 = 1
    func 면적() -> Int {
        return 길이 * 너비
    }
    mutating func scaleBy(res: Int) {
        길이 *= res
        너비 *= res
        print(길이)
        print(너비)
    }
}
var val = 면적(길이: 3, 너비: 5)
val.scaleBy(res: 3)
val.scaleBy(res: 30)
val.scaleBy(res: 300)

위 프로그램 실행 출력 결과는 다음과 같습니다:

9
15
270
450
81000
135000

변경 가능한 메서드에서 self에 값을 할당하려면

변경 가능한 메서드는 은닉 속성 self에 새로운 예제를 할당할 수 있습니다.

import Cocoa
struct 면적 {
    var 길이 = 1
    var 너비 = 1
    func 면적() -> Int {
        return 길이 * 너비
    }
    mutating func scaleBy(res: Int) {
        self.길이 *= res
        self.너비 *= res
        print(길이)
        print(너비)
    }
}
var val = 면적(길이: 3, 너비: 5)
val.scaleBy(res: 13)

위 프로그램 실행 출력 결과는 다음과 같습니다:

39
65

타입 메서드

예제 메서드는 타입의 특정 예제가 호출하는 메서드입니다. 타입 자체가 호출할 수 있는 메서드를 정의할 수도 있습니다. 이 메서드는 타입 메서드라고 합니다.

구조체와 열거형의 타입 메서드는 메서드의 func 키워드 앞에 static 키워드를 추가하여 선언합니다. 클래스는 class 키워드를 사용하여 부모 클래스의 구현을 재정의할 수 있는 자식 클래스를 허용할 수 있습니다.

타입 메서드는 예제 메서드와 같이 점(.) 문법으로 호출됩니다.

import Cocoa
class Math
{
    class func abs(number: Int) -> Int
    {
        if number < 0
        {
            return (-number)
        }
        else
        {
            return number
        }
    }
}
struct absno
{
    static func abs(number: Int) -> Int
    {
        if number < 0
        {
            return (-number)
        }
        else
        {
            return number
        }
    }
}
let no = Math.abs(number: -35)
let num = absno.abs(number: -5)
print(no)
print(num)

위 프로그램 실행 출력 결과는 다음과 같습니다:

35
5