Swift 문법 4

이나래·2022년 10월 16일
  • Swift 문자열 서식 (swift string format 자리수)
    BMI 계산 결과 판정기 소수점 1자리수로 나타내기

import Foundation
let weight = 60.0
let height = 170.0
let bmi = weight / (heightheight0.0001) // kg/m*m
let shortenedBmi = String(format: "%.1f", bmi) //shortenBmi 라는 함수를 사용해 소수점 한자리 값만 나타내도록 하겠다는 의미
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:20.8, 판정:정상

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

import Foundation
func calcBMI(weight : Double, height : Double) -> String{
let bmi = weight / (heightheight0.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: 182.3))

-> 출력 : BMI:21.8, 판정:정상

  • if-else를 swich-case로 변형

import Foundation
func calcBMI (weight : Double, height : Double) { //Void형
let bmi = weight / (heightheight0.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: 162.3) // 자체적으로 case문에서 print를 하고 있기 때문에 호출만 하면 됨

-> 출력 : BMI:23.7,판정:정상

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

import Foundation
func calcBMI(weight : Double, height : Double) -> String {
let bmi = weight / (heightheight0.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:65.0, height: 170.0))

-> 출력 : BMI:22.5, 판정:정상

  • first class object : (1) 함수를 변수에 저장 가능
    - Swift는 함수를 데이터 타입처럼 처리할 수 있음
    - swift의 함수는 1급 객체임
    • 1급 객체(first class object) 또는 1급 시민(first class citizen) 다음 조건을 충족하는 객체를 1급 객체라고 함
      1) 변수에 저장할 수 있음
      2) 매개변수로 전달할 수 있음
      3) 리턴값으로 사용할 수 있음

func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용
//함수를 호출하려면 원래의 함수 이름 대신에 상수 이름을 이용하여 호출 가능
print(type(of:toFeet))
print(inchesToFeet(inches:10))
print(toFeet(10)) //주의 : 매개변수명(inches:) 안씀

-> 출력 :
(Float) -> Float
0.833333
0.833333

  • first class object : (2) 함수를 매개변수로 전달할 수 있음

func inchesToFeet (inches: Float) -> Float {
return inches * 0.0833333
}
let toFeet = inchesToFeet //함수를 자료형처럼 사용
//함수를 호출하려면 원래의 함수 이름 대신에 상수 이름을 이용하여 호출 가능
print(type(of:toFeet))
print(inchesToFeet(inches:10))
print(toFeet(10)) //주의 : 매개변수명(inches:) 안씀
// 매개변수로 함수를 받으려면, 함수를 받게 될 함수는 함수의 데이터 타입을 선언함
func outputConversion(converterFunc: (Float) -> Float, value: Float) {//함수를 매개변수로 사용
let result = converterFunc(value) //toFeet(10)
print("Result = (result)")
}
outputConversion(converterFunc:toFeet, value: 10) // 피트로 변환하는 inchesToFeet함수 호출

-> 출력 :
(Float) -> Float
0.833333
0.833333
Result = 0.833333

  • 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 outputConversion(converterFunc: (Float) -> Float, value: Float) { //함수를 매개변수로 사용
let result = converterFunc(value)
print("Result = (result)")
print(type(of:result))
}
outputConversion(converterFunc:toYards, value: 10) // 야드로 변환하는 inchesToYards함수 호출
outputConversion(converterFunc:toFeet, value: 10) // 피트로 변환하는 inchesToFeet함수 호출
func decideFunction (feet: Bool) -> (Float) -> Float
{ //매개변수형 리턴형이 함수형
if feet {
return toFeet //함수를 리턴
} else {
return toYards
}
}

-> 출력 :
Result = 0.277778
Float
Result = 0.833333
Float

  • 함수 : 1급 객체 실습

func up(num: Int) -> Int {
return num + 1
}
func down(num: Int) -> Int {
return num - 1
}
let toUp = up // up을 toUP에 넣어줌 -> 변수에 저장
print(up(num:10)) // up으로 호출 시 (up(num:10))
print(toUp(10)) // toUp으로 호출 시 toUp(10)
let toDown = down // down을 toDown에 넣어줌 -> 변수에 저장

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 // 참이면 toUp
} else {
return toDown // 그렇지 않으면 toDown
}
}
let r = decideFun(x:true) // let r = toUp
print(type(of:r)) //(Int) -> Int
print(r(10)) // toUp(10)

-> 출력 :
11
11
결과 = 11
결과 = 9
(Int) -> Int
11

  • 클로저(Closure) 표현식
    익명함수
    클로저 표현식은 독립적인 코드 블록

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))
print(type(of:add1))

-> 출력 :
30
(Int, Int) -> Int

클로저 표현식은 매개변수를 받거나, 값을 반환하도록 만들 수도 있음

{(<매개변수 이름>: <매개변수 타입>, … ) -> <반환 타입> in
// 클로저 표현식 코드
}

  • 두 개의 정수 매개변수를 받아서 정수 결과 값을 반환

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

-> 출력 :
200
(Int, Int) -> Int

  • 후행 클로저(trailing closure)
    클로저가 함수의 마지막 argument라면 마지막 매개변수명(cl)을 생략한 후 함수 소괄호 외부에 클로저를 작성

func someFun(cl: () -> Void) {

}
// trailing closure를 사용 안하면
someFun(cl: {
//closure’s body
})
// trailing closure 사용
someFun() {
//trailing closure's body goes here
}

let onAction = UIAlertAction(title: "On", style:
UIAlertAction.Style.default) {
ACTION in self.lampImg.image = self.imgOn
self.isLampOn=true
} // 후행 클로저

let removeAction = UIAlertAction(title: "제거", style:
UIAlertAction.Style.destructive, handler: {
ACTION in self.lampImg.image = self.imgRemove
self.isLampOn=false
}) // 후행 클로저 미사용

< 인덕대학교 'iOS 프로그래밍 기초' 한성현 교수님 강의 자료 참고 >

0개의 댓글