if-else문
var x = 3
if x % 2 == 0 {
print("짝수입니다") }
else{
print("홀수입니다") }
Swift에서는 조건문에 괄호를 하지않아도 됨.
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)")
switch-case문
var value = 2
switch (value)
{
case 0:
print("영")
case 1:
print("일")
case 2:
print("이")
case 3:
print("삼")
default:
print("4이상")
}
일반적인 switch-case문은 break를 명시해줘야 하지만, Swift에서는 break가 자동으로 삽입

var temperature = 60
switch (temperature)
{
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
where절은 부가적인 조건을 추가하는 것.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 짝수만 출력하기
for number in numbers where number % 2 == 0 {
print(number)
} //gpt한테 물어본 where절 예제


var value = 4
switch (value)
{
case 4:
print("4")
fallthrough
case 3:
print("3")
fallthrough
case 2:
print("2")
fallthrough
default:
print("1")
}
Swift는 일치하는 case문을 만나면 자동으로 빠져나옴, break문이 자동으로 포함.
case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문 사용



언어별 switch-case문의 차이
method "함수"
optional과 guard문, 함수에서 대부분 시험문제 출제 ㅎ


함수를 호출할 때는 argument를 호출, 받아서 처리할 때는 parameter 사용.
Swift에서는 함수를 만들때 func로 시작

//간단한 함수정의
func sayHello() -> Void{//정의부분- 반환값이 없다면 "-> Void" 생략가능
print("leeeeeee")
}
sayHello() //호출

//int add(int x, int y) { //C
//return(x+y);
//}
//add(10,20);
func add(x: Int,y: Int) -> Int{
return x+y
}
add(x:66,y:99) //x는 argument label, 10이 argument
print(add(x: 100, y: 11))

func add(x: Int,y: Int) -> Int{
return x+y
}
func sayHello() {
print("Hello")
}
//add(x: 10,y: 20) x는 argument label, 10이 argument
//print(add(x: 10, y: 30))
var x=10
print(type(of: x))
print(type(of: add)) //argument 의 자료형을 ,로 구분하여 적고 -> 뒤에는 함수의 리턴형 자료형
print(type(of: sayHello)) // (): 빈 튜플, void형.


함수의 자료형은 argument의 자료형과 함수의 리턴형으로 이루어짐. 그냥 Int 이렇게 쓰면 안된다.
Void형일 경우 ()로 표시

매개변수명 두개 작성이 가능함. 함수 호출할 때 사용하는 외부 매개변수명, 함수 정의 시 내부 매개변수명 사용
하나만 쓸 경우 외부 매개변수명이 생략된 것.
//func add(x: Int,y: Int) -> Int{ // 함수의 리턴형이 Int
// return x+y
//}
//print(add(x: 10, y: 30))
func add(first x: String, second y: String) -> String{ // (String,Int) -> String으로 하니 오류 발생
return x+y
}
print(add(first: "hi", second: " junyeong"))
print(type(of: add))

//func add(x: Int,y: Int) -> Int{ // 추천
// return x+y
//}
//print(add(x: 10, y: 30))
//func add(first x: Int, second y: Int) -> Int{
// return x+y
//}
//print(add(first:10, second:20))
//func add(_ x: Int, _ y: Int) -> Int{
// return x+y
//}
//print(add(10, 20))
func add(_ x: Int, with y: Int) -> Int{ //혼합한 방식, 가장 많이 사용
return x+y
}
print(add(10, with:20))
print(type(of: add))
가독성을 높이기 위해 처음 변수는 외부 이름을 생략하고 두번째 변수부터 외부 이름을 사용함.
func add(x: Int,y: Int) -> Int{ // 추천
print(#function) //add(x:y:) 함수명을 보기 위한 literal
return x+y
}
print(add(x: 10, y: 30))
func add(first x: Int,second y: Int) -> Int{
print(#function) //add(first:second:)
return x+y
}
print(add(first: 10, second: 30))
func add(_ x: Int, _ y: Int) -> Int{
print(#function) //add(_:_:)
return x+y
}
print(add(10,20))
func add(_ x: Int, with y: Int) -> Int{
print(#function) //add(_:with:)
return x+y
}
print(add(10, with: 20))
//print(type(of: add))
//함수 이름이 add로 같아보여도 이름이 다름. 오류가 나지않고 실행이가능

마지막 콜론 생략하지 않도록 주의.
콜론의 개수가 매개변수의 개수


함수이름 : tableView(_:numberOfRowsInSection:)
함수의 자료형: (UITableView,Int) -> Int
ChatGPT과제 - iOS 테이블뷰에서 많이 사용하는 메서드를 많이 사용하는 순서대로 나열하고 예를 들어 기능을 설명하고, 전체 메서드 이름과 메서드 자료형을 알려줘



guard문
var x = 1
while true {
guard x < 5 else { break }//조건(x<5)이 거짓일 때 실행(break)
print(x) //1 2 3 4, 조건(x<5)이 참일 때 실행
x = x + 1
} //조건을 반대로 줘야 if문과 결과가 같음 -> if문이 더 편해서 이렇게 사용하지 않음
var x = 1
while true {
if x > 4 { break } //조건이 참일때 실행, guard문은 다름
print(x) //1 2 3 4
x = x + 1
}
블록이 있는 경우만 guard문 사용.
func multiplyByTen(value: Int?) {
guard let number = value else {//조건식이 거짓(nil)일 때 else 블록 실행
print("nil")
return
}
print(number*10) //조건식이 참일 때 실행, 주의 : number를 guard문 밖인 여기서도 사용 가능
}
multiplyByTen(value: 3) //30
multiplyByTen(value: nil)
multiplyByTen(value: 10) //100
지역변수인 number가 guard문 밖에서 쓰인다는 것이 말이 안되지만, Swift에서는 가능하다.

func printName(firstName: String, lastName: String?) {
// if let
if let lName = lastName { // lastName이 nil이 아니면
print(lName, firstName)
} else {
print("성이 없네요!")
}
// guard let
guard let lName = lastName else { // lastName이 nil이면
print("성이 없네요!")
return // early exit
}
print(lName, firstName)
}
printName(firstName: "길동", lastName: "홍")
printName(firstName: "길동", lastName: nil)
- guard는 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능
- 그래서 함수 뿐 아니라 반복문 등 특정 블록 내부에 있으면 사용 가능
- 함수 내부에 있다면 보통 return을 써서 해당 함수를 조기에 빠져나오는 조기 출구 용도로 사용
- 실제 앱을 만들다 보면 옵셔널 바인딩 때문에 다중 if~else를 사용해야 하는데, guard~let을 사용하면 다중 루프 없는 훨씬 가독성이 좋은 코드가 가능해서 if~let보다 많이 사용

함수를 호출할 때 값을 지정하지 않으면, 함수를 정의할 때 미리 지정되어 있는 값을 씀 : default argument 라고 함.
ex) print 함수의 separator , terminator
import Foundation //format 사용하기 위해 Foundation 프레임워크 import
func sss(x : Int, y : Int) -> (sum : Int, sub : Int, div : Double)
{
let sum = x+y
let sub = x-y
let div = Double(x)/Double(y) //같은 자료형만 연산 가능, Int형을 double로 둘 다 변경
print(#function) // 함수 이름: sss(x:y:)
return (sum, sub, div) //튜플로 리턴
} //2개의 정수를 입력받아 가감제 리턴
var result = sss(x:10,y:3)
print(type(of: sss)) // 함수의 자료형: (Int, Int) -> (sum: Int, sub: Int, div: Double)
print(String(format: "%.3f", result.div)) //세번째 자리에서 반올림
print(result.sum)
print(result.sub)
print(result.div)
4주차도 끝~~