• 함수정의 와 호출
    • 함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부름
      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"]