func 키워드로 생성
func name(parameters) -> ReturnType {
}
func sayHello(to name: String) {//Argument Laberl : to, Parameter Name : name
print("Hello, \(name)")
}
sayHello(to: "abc")
_(underbar)로 생략가능func sayHello(_ name: String){// func sayHello(name: String)
print("Hello, \(name)")
}
sayHello("abc")
func sayHello(name: String){// func sayHello(name: String)
print("Hello, \(name)")
}
sayHello(name: "abc")
->를 쓰고 그뒤에 Return하고자 하는 Type 명시
func sayHello(name: String) -> String{
return name
}
func sayHello(name: String) {}//리턴 타입이 없을경우
func sayHello(name : String){
name = "abc" // 에러
}
func changeName(human: Human){
human.name = "abc"
}
let person = Human.init(name: "edf", age: 10)
changeName(human: person)
print(person.name) // abc
1. 함수 파라미터 선언할 때 inout 키워드 작성
func sayHello(name: inout String) {}
2. 함수를 호출할 때 Argument 앞에 & 붙이기
sayHello(name: &name)
func sayHello(name: String = "Stranger"){
print("Hello, \(name)")
}
sayHello()
sayHello(name: "abc")
...을 붙임func printSum(of nums: Int...) {} //nums이라는 가변 파라미터는 Int형 배열이 됨
printSum(of: 1,2,3,4)
func printSum2(of nums: Int..., initValue: Int){ }
printSum(of: 1,2,3,4, initValue: 100)
// 가변 파라미터는 ,를 이용하기 때문에 가변 파라미터 뒤에있는 파라미터는 무조건 Argument Label을 가짐
다른 함수 안에 포함되어 있는 함수
func outer(){
print("outer")
func inner(){
print("inner")
}
inner()// 가능
}
inner() 불가능
func outer() -> () -> (){
print("outer")
func inner(){
print("inner")
}
return inner()
}
let inner = outer()
inner() // 가능
// 함수 // 표기법
func sayHello(name: String ) { } // sayHello(name:)
func sayHello(_ name: String ) { } // sayHello(_:)
func sayHello(to name: String) { } // sayHello(to:)
func sayHello(name: String, age: Int) { } // sayHello(name:age:)
// 함수 // 표기법
func sayHello() { } // sayHello
func sayHelloToSodeul() { } // sayHelloToSodeul
// 함수 // 함수타입
func sayHello() {} // () -> ()
// 함수 // 함수타입
func sayHello(_ name: String) {} // (String) -> ()
func sayHello(_ name: String, _ age: Int, alias: String) -> String {} // (String, Int, String) -> String
(Int...) -> (), 입출력 파라미터일 경우 (inout Int, inout Int) -> ()일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.1. 변수나 상수에 함수를 대입할 수 있어야 한다.
해당 변수나 상수가 함수 자체 처럼 쓰이는 것
1. 함수 이름으로 대입
오버로딩 된 경우 같은 이름의 함수가 여러 개이기 때문에 에러
func sayHello(_ name: String) {}
let f = sayHello
func sayHello(_ name: String) {}
func sayHello(_ name: String, _ age: Int) {}
let f: (String) -> () = sayHello
func sayHello(name: String) {}
func sayHello(_ name: String) {}
let f = sayHello(name:)
f("abc") // 함수 실행, Argument Label을 사용할 경우 에러
2. 함수의 반환 타입으로 함수를 사용할 수있다.
func outer() -> () -> () { // 처음 '()' 은 outer 파라미터 뒤의 '() -> ()' 은 outer 리턴타입(inner 함수 타입)
func inner() {
print("inner!")
}
return inner
}
let f = outer()
f()
3. 함수의 파라미터로 함수를 전달할 수 있다.
콜백함수에서 많이 사용
func doSomething(_ callback: () -> ()){
callback()
}
func success(){
print("success!")
}
doSomething(success)
doSomthing{
print("Success!")
}
func doSomething(_ callback: (String) -> ()) {
callback("abc")
}
doSomething{message in
print("Success!"+message)
}
참조
개발자 소들이