- 함수정의 와 호출
- 함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부름
func saygoodbye() { //리턴값 없으면( -> Void ) 지정하지 않아도 됨 print("goodbye") } saygoodbye() //goodbye함수 호출함수 호출 func multiply(x:Int, y:Int) -> Int{ return(x*y) } print(multiply(x:10, y:20)) //200 let x = multiply(x:10, y:20) print(x) //200
- 메서드(method)
- 특정 클래스, 구조체, 열거형 내의 함수
- 함수를 스위프트 클래스 내에 선언하면 메서드라 부름
- 옵셔널 사용이유
- 옵셔널 타입만이 값을 갖지 않는다는 의미의 nil 값을 가질 수 있음
var ho = nil // error var ho : Int? = nil // OK var ho : Int? // OK, 위와 같은 코드 옵셔널 변수는 초기화하지 않으면 자동으로 nil로 초기화 var sh : String = nil // 유효하지 않은 코드 let myConstant = nil // 유효하지 않은 코드
-
함수 호출 (내부 매개변수 이름 / 외부 매개변수 이름)
func add(first x :Int , second y :Int ) → Int { //외부 내부 :자료형, 외부 내부 :자료형 -> 리턴형 return (x+y) // 함수 정의 할때는 내부매개변수명 사용 } add(first:10, second:20) //함수 호출 할때는 외부매개변수명 사용
func ho(x:String, y:String) -> String{ //외부 매개변수명 생략하면 내부 매개변수명이 외부 매개변수명까지 겸함 return(x+y) } print(type(of:ho)) //(String,String) -> String print(ho(x:"ho", y:"hi")) //hohi func ho1(fir x:String, sec y:String) -> String{ return(x+y) //내부 매개변수명: 함수 내부에서 사용 } print(type(of:ho1)) //(String,String) -> String print(ho1(fir:"ho", sec:"hi")) //hohi //외부 매개변수명: 호출할 때 사용 func ho2(_ x:String, _ y:String) -> String{ // [_] 외부매개변수명 생략한다는 의미 return(x+y) } print(type(of:ho2)) //(String,String) -> String print(ho2("ho","hi")) //hohi func ho3(_ x:String, with y:String) -> String{ // 첫번째 외부매개변수명만 생략하는 경우가 많음 return(x+y) } print(type(of:ho3)) //(String,String) -> String print(ho3("ho",with:"hi")) //hohi
- 디폴트 매개변수(아규먼트)
- argument로 전달하는 값이 없는 경우, 디폴트 매개변수 값을 사용
func sayHello(count: Int = 4, name: String = "현호") -> String { return ("\(name), 너의 번호는 \(count)") } var ho = sayHello() print(ho) //현호, 너의 번호는 4 var ho1 = sayHello(count:40, name: "컴소") print(ho1) //컴소, 너의 번호는 40
- 함수로부터 여러 개의 결과 반환
-
함수는 여러 결과 값들을 튜플로 감싸서 반환할 수 있다
func converter(length: Float) -> (yards: Float, centimeters: Float, meters: Float) { let yards = length * 0.0277778 let centimeters = length * 2.54 let meters = length * 0.0254 return (yards, centimeters, meters) } var lengthTuple = converter(length:20) print(lengthTuple.yards) //0.555556 print(lengthTuple.centimeters) //50.8 print(lengthTuple.meters) //0.508
-
가감제 리턴 (2개의 정수를 입력받는)
import Foundation // 가감제 사용하기위한 임포트 func ho(x : Int, y : Int) -> (sum : Int, sub :Int, div : Double){ let sum = x+y let sub = x-y let div = Double(x)/Double(y) return (sum,sub,div) } var result = ho(x:40,y:3) print(result.sum) //43 print(result.sub) //37 print(result.div) //13.33333333333334 let h = String(format: "%.4f",result.div) print(h) //13.3333
-
- 가변 매개변수
- 함수가 지정된 데이터 타입으로 0개 또는 그 이상의 매개변수를 받는다는 것을 가리키기 위해서 세 개의 점(…)을 이용하여 선언
//임의의 개수의 정수 값의 합을 출력하는 함수 inout - call by referenceinout - call by referenceinout - call by reference import Foundation func add(numbers : Int...){ var sum:Int = 0 //변수값 초기화 필요 var sub:Int = 1 for num in numbers{ sum += num sub *= num } print(sum) print(sub) } add(numbers:1,2,3,4,5) //15 120
- Inout - Call By Reference
-
함수가 값을 반환한 후에도 매개변수에 일어난 변화를 유지하려면
함수의 선언부에서 매개변수를 입출력 매개변수(inout parameter)로 선언해야 한다.
var ho = 4 func multipleValue (value: inout Int) -> Int { //call by reference하고 싶은 매개변수의 자료형 앞에 inout을 쓴다 value *= value return(value) } print(ho) //4 print(multipleValue(value : &ho)) //16 call by reference하고 싶은 변수에 &붙여서 호출 print(ho) //16
-
- 함수를 매개변수로 사용
- Swift는 함수를 데이터 타입처럼 처리할 수 있다
func inchesToFeet (inches: Float) -> Float { return inches * 0.0833333 } let toFeet = inchesToFeet //함수를 자료형처럼 사용 var result = toFeet(100) //inchesToFeet(inches:100) print(type(of:inchesToFeet)) //(Float) -> Float print (result) //8.33333
- 함수를 매개변수로 사용 + 리턴값
func add (num: Int) -> Int { return num + 4 } func add2 (num: Int) -> Int { return num + 8 } print(type(of:add)) //(int) -> int let toadd = add print(type(of:toadd)) //(int) -> int let toadd2 = add2 func outputConversion(converterFunc: (Int) -> Int, value: Int) { //함수를 매개변수로 사용 let result = converterFunc(value) print("Result = \(result)") //Result =18 Result =14 } print(type(of:outputConversion)) //((int) -> int,int)) -> () outputConversion(converterFunc:toadd2, value: 10) // toadd2로 변환하는 add2함수 호출 outputConversion(converterFunc:toadd, value: 10) // toadd로 변환하는 add함수 호출
- Swift 함수명
- 함수명(외부매개변수:외부매개변수:…) → :의 개수가 매개변수의 개수
func add(x: Int, y: Int) -> Int { return(x+y) } //함수명 = add(::) func add(first x: Int, second y: Int) -> Int { return(x+y) } //함수명 =add(first:second:) func tableView(_ tableView: UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell //함수명 = tableView(_:cellForRowAt:) func tableView(_ tableView: UITableView,numberOfRowsInSection section:Int) -> Int //함수명 = tableView(_:numberOfRowsInSection:)
- 클로저
- 클로저 표현식은 독립적인 코드 블록
- 클로저 표현식은 매개변수를 받거나, 값을 반환하도록 만들 수도 있음
func add(h: Int, s: Int) ->Int { return(h+s) } print(add(h:4,s:10)) //14
▼
let add1 = { (h: Int, s: Int) -> Int in return(h+s) } print(add1(4,10)) //14
- 클로저 표현식은 독립적인 코드 블록
- 후행 클로저(trailing closure)
-
클로저가 함수의 마지막 매개변수라면
마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현한다.
let names: [String] = ["kim","shin","lee","han"] let Hostring: [String] = names.sorted() { (left: String, right: String) -> Bool in return left > right } print(Hostring) //["shin", "lee", "kim", "han"] // sorted(by:) 메서드의 소괄호까지 생략 가능 let Hostring1: [String] = names.sorted { (left: String, right: String) -> Bool in return left > right } print(Hostring1) //["shin", "lee", "kim", "han"] // 클로저의 매개 변수 타입과 반환 타입을 생략 let Hostring2: [String] = names.sorted { (left, right) in return left > right } print(Hostring2) //["shin", "lee", "kim", "han"] // 단축 인자 이름 사용 let Hostring3: [String] = names.sorted { return $0 > $1 } print(Hostring3) //["shin", "lee", "kim", "han"] // 암시적 반환 표현 사용 let Hostring4: [String] = names.sorted { $0 > $1 } print(Hostring4) //["shin", "lee", "kim", "han"]
-