함수의 가장 기본적인 형태는 아래와 같다.
func message(name: String, age: Int) -> String {
return("이름은 \(name), 나이는 \(age)다.")
}
함수이름 : message, 매개변수: name, 매개변수타입: String, 리턴값의 타입 : String
return 함수의 코드(string타입의)
func message2() -> Void {
print("Hello world")
}
만약 리턴값이 존재하지 않는 경우에는 Void를 써주어도되고, 생략을 해줘도 무방하다.
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의 호출방식이 대부분 그렇기에 이러한 방법을 알아둬야 하는 것이다. 따라서, 정말 중요한 함수 표현방식이다.
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 매개변수는 디폴트값을 가지고있으며, 특별히 이름이 인자로 전달되지 않는 경우에는 그냥 디폴트값이 튀어나온다.
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) // 출력됨
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)
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)리턴값으로 사용가능
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 함수 호출