본문 바로가기
IOS 기초

[IOS 기초] 5주 Swift 문법 4(일급시민 클로저 기초)파일

by heeaeeeee 2024. 10. 9.

BMI 계산 결과 판정

let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m
var body = ""
if bmi >= 40 {
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI:\(bmi), 판정:\(body)")

> 함수로 만들기

Swift 문자열 서식(swift string format 자리수)

import Foundation
let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi)
var body = ""
if bmi >= 40 {
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI:\(shortenedBmi), 판정:\(body)")

BMI 를 판정하는 calcBMI()함수 정의

import Foundation
func calcBMI(weight: Double, height: Double)-> String{
let bmi = weight / (height * height * 0.0001) // kg/m*m
let shortenedBmi = String(format : "%.1f", bmi)
var body = ""

if bmi >= 40{
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40{
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30{
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25{
body = "정상"
} else{
body = "저체중"
}
return "BMI : \(shortenedBmi), 판정 : \(body)"
}
print(calcBMI(weight : 62.5, height : 172.3))

if~else를 switch~case로

import Foundation
func calcBMI (weight : Double, height : Double) { //Void형
  let bmi = weight / (height*height*0.0001) // kg/m*m
  let shortenedBmi = String(format: "%.1f", bmi)
  switch bmi {
    case 0.0..<18.5:
    print("BMI:\(shortenedBmi),판정:저체중")
    case 18.5..<25.0 :
    print("BMI:\(shortenedBmi),판정:정상")
    case 25.0..<30.0 :
    print("BMI:\(shortenedBmi),판정:1단계 비만")
    case 30.0..<40.0 :
    print("BMI:\(shortenedBmi),판정:2단계 비만")
    default :
    print("BMI:\(shortenedBmi),판정:3단계 비만")
  }
}
calcBMI(weight:62.5, height: 172.3)

switch~case + 판정 결과 리턴하는 함수

import Foundation
func calcBMI(weight : Double, height : Double) -> String {
  let bmi = weight / (height*height*0.0001) // kg/m*m
  let shortenedBmi = String(format: "%.1f", bmi)
  var body = ""
  switch bmi {
  case 0.0..<18.5:
  body = "저체중"
  case 18.5..<25.0:
  body = "정상"
  case 25.0..<30.0:
  body = "1단계 비만"
  case 30.0..<40.0 :
  body = "2단계 비만"
  default :
  body = "3단계 비만"
  }
  return "BMI:\(shortenedBmi), 판정:\(body)"
}
print(calcBMI(weight:60.0, height: 170.0))

 

1급 객체(first class object) 1급 시민(first class citizen)

제약이 없음 > 변수에 저장, 매개변수로 전달, 리턴값으로 사용 > Swift의 함수(1급 객체)

 

first class object : (1)함수를 변수에 저장 가능

func inchesToFeet (inches: Float) -> Float {
  return inches * 0.0833333
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용

print(inchesToFeet(inches:10))
print(toFeet(10)) //주의 : argument label인 (inches:) 안 씀

 

first class object : (2) 함수를 매개변수로 사용

func inchesToFeet (inches: Float) -> Float {
  return inches * 0.0833333
}
let toFeet = inchesToFeet

func outputConversion(converterFunc: (Float) -> Float, value: Float) {//함수를 매개변수로 사용
  let result = converterFunc(value) //toFeet(10)
  print("Result = \(result)")
}
outputConversion(converterFunc:toFeet, value: 10) // 피트로 변환하는 inchesToFeet함수 호출

 

first class object : (3) 함수를 리턴값으로 사용

func inchesToFeet (inches: Float) -> Float {
  return inches * 0.0833333
}
func inchesToYards (inches: Float) -> Float {
  return inches * 0.0277778
}
let toFeet = inchesToFeet
let toYards = inchesToYards

함수 : 일급 객체 실습

func up(num: Int) -> Int {
  return num + 1
}
func down(num: Int) -> Int {
  return num - 1
}
let toUp = up
print(up(num:10))
print(toUp(10))
let toDown = down

func upDown(Fun: (Int) -> Int, value: Int) {
  let result = Fun(value)
  print("결과 = \(result)")
}
upDown(Fun:toUp, value: 10) //toUp(10)
upDown(Fun:toDown, value: 10) //toDown(10)
func decideFun(x: Bool) -> (Int) -> Int {
//매개변수형 리턴형이 함수형
  if x {
    return toUp
  } else {
    return toDown
  }
}
let r = decideFun(x:true) // let r = toUp
print(type(of:r)) //(Int) -> Int
print(r(10)) // toUp(10)

실행결과

 

 

클로저(Closure)

클로저 표현식

func add(x: Int, y: Int) -> Int {
  return(x+y)
}
print(add(x:10, y:20))
// 실행 결과 : 30

// 클로저 표현식
let add1 = { (x: Int, y: Int) -> Int in
  return(x+y)
}
print(add1(x:10, y:20)) //주의 error: extraneous(관련 없는) argument labels 'x:y:' in call
print(add1(10, 20)) //OK
print(type(of:add1))
/* 실행 결과 : 30
(Int, Int) -> Int */

func mul(val1: Int, val2: Int) -> Int
{
  return val1 * val2
}
let result = mul(val1:10, val2:20)
print(result)

//클로저 표현식
let multiply = {(val1: Int, val2: Int) -> Int in
                      //매개변수            리턴형
  return val1 * val2
}// 여기서 multiply의 자료형은 (Int, Int) -> Int
let result = multiply(10, 20) //상수를 함수처럼 호출,200

 

IOS 강의 자료 참고했습니다.