함수 정의
- -> 로 결과 타입 선언
// 반환 타입이 없는 경우 생략가능
func gretting() -> Void {
}
//반환 타입과 같은 타입의 값 반환
func areYouOK() -> Bool {
return true
}
func favoriteDrink() -> String {
return "Cola"
}
- 다수의 값 반환 : 튜플
// 튜플 반환 함수 정의
func random3() -> (Int,Int,Int) {
let r1 = Int(arc4random() % 10)
let r2 = Int(arc4random() % 10)
let r3 = Int(arc4random() % 10)
return (r1,r2,r3)
}
//사용
var (num1,num2,num3) = random3()
print("Random1 : \(num1) Random2 :\(num2) Random3 :\(num3)")
//출력값
Random1 : 9 Random2 :0 Random3 :1
함수 파라미터
•함수 동작에 필요한 정보 전달
- 파라미터가 있는 함수
//파라미터 1개
func greeting(person: String) {
print("Hello " + person)
}
//파라미터 2개
func greeting(person: String, emotion: String) {
print("Hello " + person + " with " + emotion)
}
//사용
greeting(person: "Emong")
greeting(person: "Emong",emotion: "Happy")
//출력결과
Hello Emong
Hello Emong with Happy
- 함수의 이름이 같더라도 호출한 파라미터에 맞는 함수를 호출
- 파라미터 이름
- 수동으로 설정하기 - 파라미터 앞에 선언
- 별도로 설정하지 않으먄 - 내부 파라미터 이름과 동일
func greeting(who person : String) {
print("Hello" + person)
}
greeting(who: "Swift")
func greeting(person: String, with emotion: String) {
print("Hello " + person + " with " + emotion)
}
greeting(person: "My Friend ", with: "Hug")
//출력결과
Hello Swift
Hello My Friend with Hug
- 외부 파라미터 이름 사용 생략 _
func greeting(_ person : String) {
print("Hello " + person)
}
greeting("Friend")
func greeting(person: String,_ emotion: String) {
print("Hello " + person + " with " + emotion)
}
greeting(person: "Emong ","Smile")
//실행결과
Hello Friend
Hello Emong with Smile
- 파라미터 기본값
- = 기호와 함께 사용하여 기본값 설정
- 호출 시 생략 가능
func greeting(person : String = "Friend") {
print("Hello \(person)")
}
greeting(person: "Emong") //파라미터값
greeting() //기본값
//실행결과
Hello Emong
Hello Friend
- 가변 길이 파라미터 (Varidic Parameter)
- 갯수가 정해지지 않은 다수의 파라미터
- 타입에 '...' 사용
- 함수 파라미터에 하나만 사용 가능
- 함수 내부에서 배열로 사용
func addAll(_ values : Int...) -> Void {
print("갯수 :\(values.count)")
for v in values {
print(v)
}
}
addAll(1,2,3)
//실행결과
갯수 :3
1
2
3
- 파라미터 값 변경 : inout 선언
- 함수 내부에서는 상수로 사용 -> 파라미터 변경 시도 시 에러
- 파라미터 타입 앞에 inout을 사용해 변경 가능토록 함
func swapTwoValue(_ arg1 : inout Int, _ arg2 : inout Int) {
let temp = arg1
arg1 = arg2
arg2 = temp
}
var value1 = 1
var value2 = 2
swapTwoValue(&value1, &value2)
print(value1,value2)
//실행결과
2 1
함수와 옵셔널
- 옵셔널 타입의 파라미터
func append(str: String, num val: Int?) -> String {
guard let str2 = val else { //파라미터 nil 검사 필요
return str
}
return str + String(str2)
}
let ret = append(str: "Welcome ", num: nil) //nil 값 대입가능
let ret2 = append(str: "Welcome ", num: 5)
//실행결과
"Welcome "
"Welcome 5"
- 함수 내 함수
func outerFunc() {
func innerFunc() {
print("Inner Function works")
}
print("Outer Function Works")
innerFunc()
}
outerFunc()
//외부에서 호출 불가
innerFunc() //내부 함수는 내부에서만 실행