swift 기초문법 : 함수의 형태 총정리

Woong·2022년 8월 16일
0
post-custom-banner

1.기본형태

함수의 가장 기본적인 형태는 아래와 같다.

func message(name: String, age: Int) -> String {
	return("이름은 \(name), 나이는 \(age)다.")
}

함수이름 : message, 매개변수: name, 매개변수타입: String, 리턴값의 타입 : String
return 함수의 코드(string타입의)

func message2() -> Void {
	print("Hello world")
}

만약 리턴값이 존재하지 않는 경우에는 Void를 써주어도되고, 생략을 해줘도 무방하다.

2. 내부매개변수와 외부매개변수를 다르게 하는 경우

func add(first x: Int, second y: Int) -> Int {
	return (x+y)
}

// 외부에서 호출 할 때,

add(first: 10, second: 20)		// good~
add(x: 10, y: 20) 				// 오류

만약, 위와 같은 함수를 외부에서 매개변수 x,y를 통해 호출하려하면 오류가 발생할 것이다~

아래는 외부매개변수를 아예 사용하지않겠다는 말이다.

func add(_ x: Int, _ y : Int ) -> Int {
	return (x+y)
}

// 외부에서 호출할 때,

add(10,20)			// good
add(x: 10, y: 20)	// 오류

그리고 아래에는 첫번째 매개변수만 외부매개변수를 생략하겠다는 뜻의 함수이다. (**잘쓴다)

func add(_ x: Int, with y: Int) -> Int {
	return (x+y)
}

add(10, with: 20)	// good

*아니 근데 왜??? 이렇게 복잡하게 표현을 하냐??

이유 : swift 클래스 내에 구성되어있는 함수(메서드)들이 보통 위와 같은 형태로 되어있다.( 첫번째 매개변수만 생략한 형태로) 이유는 Objective-c의 호출방식이 대부분 그렇기에 이러한 방법을 알아둬야 하는 것이다. 따라서, 정말 중요한 함수 표현방식이다.

3.디폴트 매개변수 값을 정의하고있는 경우

func sayHello(count: Int, name: "woong") -> Int {
	return ("너의이름은 \(name) 이고, 번호는 \(count)이다.")
}

// 호출방법 1. count(번호)만 부여한다.
sayHello(count: 10)		// 너의이름은 woong 이고, 번호는 10 이다.

// 호출방법 2. count(번호)와 name(이름)을 모두 부여한다.
sayHello(count: 10, name: "다애")	// 너의이름은 다애 이고, 번호는 10 번이다.

즉, name 매개변수는 디폴트값을 가지고있으며, 특별히 이름이 인자로 전달되지 않는 경우에는 그냥 디폴트값이 튀어나온다.

4. 여러개의 결과를 반환하는 형태

func converter(length : Float) -> (yards: Float, centimeters: Float, meters: Float) {
	let yards = length * 0.027
    let centimeters = length * 2.54
    let meters = length * 0.0254
    return (yards, centimeters, meters)		// 반환값 튜플
}

var legnthTuple = convert(length:20)	// 튜플 형태로 저장

print(lengthTuple.yards)				// 튜플 내부 호출
print(lengthTuple.centimeters)			// 튜플 내부 호출
print(lengthTuple.meters)				// 튜플 내부 호출

이해 가는가? 나는 간다.
아래는 두개의 값을 입력하여 연산을 통해 세가지 값을 반환 받을 수 있다.

func Calculater(firstNum: Int, secondNum: Int) -> (sum : Int, sub: Int, div: Double) {
	let sum = firstNum + secondNum
    let sub = firstNum - secondNum
    let div = Double(firstNum) / Double(secondNum)
    return (sum, sub, div)
}		

var result = Calculater(firstNum: 10, secondNum: 5)	// 이러면 result에 튜플형태로 저장됨

print(result.sum)	// 출력됨
print(result.sub)	// 출력됨
print(result.div) 	// 출력됨

5. 가변 매개변수

func displayStrings(messages: String...) {
	for message in messages {
    	print(message)
    }
}
displayStrings(messages: "일","이","삼","사")
displayStrings(messages: "one","two","three","four","fiveeee")

지정한 데이터타입(String) 형태로 0개 ~ 무한대로 값을 받는다는 것이다. (...)을 활용하면 그렇게 할 수 있어. 편리할듯 ??

아래에선, 위와 같은 방식으로 매개변수에 전달한 인자들의 합을 구해볼 수 있음.

func calculater(numbers: Int...) {
	var sum : Int = 0
	for number is numbers {
    	sum += number
    }
    print(sum)
}

calculater(numbers: 1,2,3,4,5,6,7,8,9,10)

6. 함수를 매개변수처럼 사용하는 형태

func inchesToFeet(inches: Double) -> Double {
	return inches * 0.833
}

let valueOfFeet = inchesToFeet		// 함수를 자료형으로 사용했다.

// 호출 할 때, 방법 1. 상수를 활용하여 호출 한다.

var result = valueOfFeet(10)

// 호출 할 때, 방법 2. 원래 방식대로 매개변수에 인자를 대입한다.

var result = inchesToFeet(inches: 10)

inchesToFeet 함수의 타입은 (Double) -> Double 임.
그리고, 자료형을 대입한 상수의 타입은 어떻게되었을까?
(Double) -> Double 이 된다. 신기하다.

1급객체(first class object), 1급시민(first class citizen) :

어떤 함수에 다른 함수를 인자로 넘겨주거나 함수의 반환 값으로 함수를 넘겨 줄 수있음.
1) 변수에 저장가능, 2)매개변수로 전달 가능 , 3)리턴값으로 사용가능

7. 함수를 매개변수 or 리턴값으로 사용하는 형태

func inchesToFeet(inches : Float) -> Float {	// 타입 (Float) -> Float
	return inches * 0.083
}
func inchesToYards(inches : Float) -> Float {	// 타입 (Float) -> Float
	return inches * 0.027
}

let toFeet = inchesToFeet		// 타입 (Float) -> Float
let toYards = inchesToYards		// 타입 (Float) -> Float

//------------------//
func outputConversion(converterFunc: (Float) -> Float, value: Float){
	let result = converterFunc(value)
    print("결과값은 \(result)입니다."
}


// ----- 호출할때--------//
outputConversion(converterFunc: toYards, value: 10)		// inchesToYards함수 호출
outputConversion(converterFunc: toFeet, value: 20)		// inchesToFeet 함수 호출

이 뒤에는 지금 사용하는 함수의 범위와 좀 떨어져있어 4-10, 4-11, 4-12 추후에 정리하자!

profile
https://github.com/iOS-Woong
post-custom-banner

0개의 댓글