iOS 프로그래밍기초 수업 5주차

도연·2022년 10월 3일
0
post-thumbnail

🚀 if문

  • 다른 프로그래밍 언어들과는 다르게, 스위프트에서는 if 문 다음의 실행 코드가 한 줄이라도 중괄호({})를 필수적으로 사용해야 한다.
  • 기본적으로 ‘불리언 표현식’이 참(true)으로 판단되면 괄호로 감싸인 코 드 실행
  • ‘불리언 표현식’이 거짓(false)이면 괄호로 감싸인 코드는 건너뜀
var x = 10
if x > 5 {
 print("5보다 큽니다")
}

🚀 guard문(조건식이 거짓이면 실행)

  • guard문은 표현식이 거짓(false)으로 판단될 경우에 수행될 else 절을 반드시 포함해야 함

    • else 절에 속한 코드는 현재의 코드 흐름을 빠져 나갈 수 있는 구문(return, break, continue, throw 구문)을 반드시 포함해야 함
    • 또는 다른 함수를 else 코드 블록 안에서 호출할 수도 있음

      guard <불리언 표현식> else {
      // 표현식이 거짓일 경우에 실행될 코드
      <코드 블록을 빠져 나갈 구문>
      }
      // 표현식이 참일 경우에 실행되는 코드는 이곳에 위치

  • guard문은 기본적으로 특정 조건에 맞지 않을 경우에 현재의 함수나 반복문에서 빠져 나갈 수 있도록 하는 ‘조기 출구(early exit)’ 전략을 제공

🚀 guard~let의 활용

  • guard는 return, break, continue, throw 등 제어문 전환 키워드를 쓸 수 있는 상황이라면 사용이 가능
  • 그래서 함수 뿐 아니라 반복문 등 특정 블록 내부에 있으면 사용 가능
  • 물론 함수 내부에 있다면 보통 return을 써서 해당 함수를 조기에 빠져나오는 조기 출구 용도로 사용

if~let vs. guard~let

// if let
func printName(firstName:String, lastName:String?){ 
 if let lName = lastName {   // lastName이 nil이 아니면
   print(lName,firstName)
 }
 else {
   print("성이 없네요!")
 }
 
--------------------------------------------------------
 
// guard let
func printName(firstName:String, lastName:String?){
guard let lName = lastName else { // lastName이 nil이면 
  print("성이 없네요!")
  return // early exit 
 } 
 print(lName,firstName) // guard let의 특징 : lName을  guard let 블럭 밖에서도 쓸수있다
}
printName(firstName: "길동", lastName:"홍")
printName(firstName: "길동", lastName:nil)

🚀 guard문

func multiplyByTen(value: Int?) {
  guard let number = value,  number < 10 else {//조건식(값이 있고 10보다 작은)이 거짓일 때 실행
     print("수가 없거나 10보다 크다.")                         //거짓 : 값이 없거나 10보다 크면 
     return
  }
  print(number*10) //조건식이 참일 때 실행, 주의 : number를 여기서도 사용 가능
}
multiplyByTen(value: 3)   //30
multiplyByTen(value: nil)   
multiplyByTen(value: 20)   

// 실행결과
30
수가 없거나 10보다 크다.
수가 없거나 10보다 크다.
  • 언래핑된 number 변수를 guard문 밖에 있는 코드가 사용할 수 있다!!
  • if문을 이용하여 언래핑된 변수는 그렇게 못함

🚀 if let vs. guard let

🚀 switch-case문

  • 각 case문 마지막에 break가 자동으로 들어 있으므로 break를 따로 안써도됨

switch 표현식
{
case match1:
구문
case match2:
구문
case match3, match4:
구문
default:
구문
}

var value = 0
switch value
{
 case 0:
   print("영")
 case 1:
   print("일")
 case 2:
   print("이")
 case 3:
   print("삼")
 default:
   print("4이상")
}

// 실행결과
영

🚀 switch-case문 주의 사항

  • case 문장마다 반드시 실행가능한 문장이 하나는 있어야함.
let anotherCharacter: Character = "a" 
switch anotherCharacter { 
case "a": // Invalid, the case has an empty body 
case "A": 
 print("The letter A") 
default: 
 print("Not the letter A") 
}
//error: 'case' label in a 'switch' should have at least one executable statement

🚀 switch-case문 결합하기

  • 여러 가지 다른 경우에 대해서 동일한 코드를 실행해야 할 경우
  • 실행될 공통 코드로 그룹 case 문을 만들 수 있음
var value = 3
var days : Int = 0
switch(value)
{
case 1,3,5,7,8,10,12:
  print("31 일입니다")
case 4,6,9,11:
  print("30 일입니다")
case 2:
  print("28 or 29 일입니다")
default:
  print("월을 잘못 입력하셨습니다")
}

// 31 일입니다

🛸 과제! switch-case문에서의 범위 지정 매칭(BMI측정기)

let weight = 90.0
let height = 180.0
let bmi = weight / (height*height*0.0001) // kg/m*m 
var body = ""

switch bmi {
case 40... :
    body = "3단계 비만"
case 30..<40:
    body = "2단계 비만"
case 25..<30:
    body = "1단계 비만"
case 18.5..<25:
    body = "저체중"
default:
    body = "정상"
}

print("BMI:\(bmi), 판정:\(body)")

🚀 switch-case에서 where절 사용하기

  • where절을 switch case에 부가적인 조건을 추가하기 위하여 사용
  • 값이 속하는 범위뿐만 아니라 그 숫자가 홀수인지 짝수인지도 검사
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")
}

// Warm and even

🚀 where

  • 특정 패턴과 결합하여 조건을 추가
var numbers: [Int] = [1, 2, 3, 4, 5]
for num in numbers where num > 1 {
    print(num)
}

//
2
3
4
5

🚀 fallthrough

  • Swift는 case 문 다음에 break를 쓰지않음
  • case별로 빠져 나가지 않고 아래로 계속 내려가게 하려면 fallthrough 문 사용
var value = 4
switch (value)
{
case 4:
 print("4")
 fallthrough 
case 3:
 print("3")
 fallthrough 
case 2:
 print("2")
 fallthrough 
default:
 print("1")
}
//
4
3
2
1

🛸 함수와 메서드(method)

🚀 함수

  • 특정 작업을 수행하는 코드 블록
    *매개변수(parameter,인자)와 인수(argument)는 차이점이 있음
  • 함수 정의부의 값을 매개변수, 호출시의 값은 아규먼트라고 부름
#include <stdio.h>
void Fun( int Param ) // parameter(매개변수, 인자), 형식 매개변수(formal parameter) 
{
   printf("%d",Param);
} 
int main()
{
   Fun( 10 ); // 10은 argument(인수), 실 매개변수(actual parameter) 
   return 0;
}

🚀 매개변수 인자 리턴값

🚀 메서드(method)

  • 특정 클래스, 구조체, 열거형 내의 함수
  • 함수를 스위프트 클래스 내에 선언하면 메서드라 부름

🚀 함수를 선언하는 방법

  • func <함수명> (<매개변수 이름>: <매개변수 타입>, <매개변수 이름>: <매개변수 타입>,... ) -> <반환값 타입> {
    // 함수 코드
    }

  • 매개변수를 받지 않으며 결과를 반환하지도 않고 오직 메시지만 출력

func sayHello() {    //리턴값 없으면( -> Void ) 지정하지 않아도 됨
     print("Hello")
}
sayHello()

🚀 스위프트 함수 정의와 호출하기

  • <함수명> (<인자1>, <인자2>, ... )
func sayHello() { //->Void
     print("Hello")
}
sayHello()   //호출

🚀 C언어에서 Swift 함수 변경 연습

int add(int x, int y)  {     //C, C++             
       return(x+y);
}
add(10,20); 

---------변경---------------

 func add(x:Int, y:Int) -> Int {
    return (x+y)
}
print(add(x:10, y:20))

🚀 함수의 타입

func add(x:Int, y:Int) -> Int {
    return (x+y)
}
print(type(of:add)) 
print(add(x:10, y:20))
let a = add(x:1, y:2)
print(a)
func sayHello() { // -> Void
    print("Hello")
}
print(type(of:sayHello))

// (Int, Int) -> Int
// 30
// 3
// () -> ()

🚀 내부 매개변수(parameter name) 이름과 외부 매개변수(argument label) 이름

func add(first x:Int, second y:Int) -> Int {
		//외부 내부:자료형,외부 내부:자료형 -> 리턴형

    return (x+y) // 함수 정의할 때는 내부 매개변수명을 사용

}
print(add(first:10,second:20)) // 함수 호출할 때는 외부 매개변수명을 사용


// 30
  • 외부 매개변수명을 생략하면 내부 매개변수명이 외부 매개변수명까지 겸함
func add(x: Int, y: Int) -> Int {                  
    return(x+y)
}
add(x:10, y:20)

🛸 (중요!) Swift 함수 실습(과제:매우 중요)and 함수의 type은?

  • 함수의 type은 모두 같고 함수명은 모두 다름
  • 밑의 코드에서 함수의 type은?
    • (Int,Int) -> Int
func add(first x:Int, second y:Int) -> Int {
    return (x+y)
}   // 함수명 : add(first:second:)  
  
func add( x:Int, y:Int) -> Int {
    return (x+y)
}  // 함수명 : add(x:y:)
  
func add(_ x:Int,_ y:Int) -> Int {  // _ 는 외부매개변수명 생략 의미
    return (x+y)
}  // 함수명 : add(_:_:)
  
func add(_ x:Int,with y:Int) -> Int {
    return (x+y)
}  // 함수명 : add(_:with:)
  
print(add(3, 5))   
print(add(x:3, y:5))
print(add(3, 5))
print(add(3, with:5))

🚀 함수명이 궁금해요 : #function 리터럴(literal)

  • Swift 함수명
    • 함수명(외부매개변수명:외부매개변수명: ...)
      * ex) func add(first x: Int, second y: Int) -> ... // first 가 외부 , x 가 내부 매개변수명

  • #function 리터럴을 사용하여 얻을 수 있음
func add(first x: Int, second y: Int) -> Int {  
  print(#function)  //add(first:second:)  
  return(x+y)
 }
 let a = add(first:10, second:20)
 
 // 실행결과 : add(first:second:)

🛸 과제 : 함수명과 함수자료형(type)

함수명

tableView( _: numberOfRowsInSection:)

tableView( _: cellForRowAt:)

자료형

(UITableView,Int) -> Int
(UITableView, IndexPath) -> UUTableViewCell

🛸 (중요) 디폴트 매개변수(아규먼트) 정의하기

  • argument로 전달하는 값이 없는 경우, 디폴트 매개변수 값을 사용
  • 함수를 선언할 때 매개변수에 디폴트 값을 할당
  • 이름이 인자로 전달되지 않을 경우에 디폴트로 "안녕?"이라는 문자열이 사용되도록 함
func sayHello(count: Int, name: String = "안녕?") -> String {
  return ("\(name), 너의 번호는 \(count)")
}  
  • 이름을 가지고 함수를 호출하면 argument를 사용
var message = sayHello(count:10, name: "철수")
//철수, 너의 번호는 10
  • 이름을 전달하지 않고도 호출 가능하며 디폴트로 "안녕?"을 사용
var message = sayHello(count:100)
print(message) //안녕?, 너의 번호는 100

🚀 함수로부터 여러 개의 결과 반환하기

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:10)
print(lengthTuple)  //과제
print(lengthTuple.yards) //과제
print(lengthTuple.centimeters) //과제
print(lengthTuple.meters) //과제

// (yards: 0.277778, centimeters: 25.4, meters: 0.254)
// 0.277778
// 25.4
// 0.254

🚀 2개의 정수를 입력받아 가감제 리턴

func sss(x : Int, y : Int) -> (sum : Int, sub : Int, mul : Int, div : Double)
{
    let sum = x+y
    let sub = x-y
    let mul = x*y
    let div = Double(x)/Double(y) //같은 자료형만 연산 가능
    return (sum, sub, mul, div)
}
var result = sss(x:10,y:3)
print(result.sum)
print(result.sub)
print(result.mul)
print(result.div)

🚀 가변 매개변수(variadic parameter)

  • 함수가 가변 매개변수를 받는다는 것을 가리키기 위해서 세 개의 점(…)을 사용
  • 지정되지 않은 개수의 String 값을 매개변수로 받아서 콘솔에 출력
func displayStrings(strings: String...)
{
  for string in strings {
    print(string)
  }
}
displayStrings(strings: "일", "이", "삼", "사")  
displayStrings(strings: "one", "two")  
  • 임의의 개수의 정수 값의 합을 출력하는 함수를 작성하여 호출해보시오.
func add(numbers:Int...)
{
	var sum:Int = 0
    for num in numbers{
    	sum += num
    }
    print(sum)
}
add(numbers:1,2,3)

inout매개변수:call by reference 구현

  • wift는 기본적으로 call by value
  • Swift에서 call by reference를 구현하는 방법

Swift 3에서는 inout의 위치가 바뀜

var myValue = 10
func doubleValue (value: inout Int) -> Int {
  value += value
  return(value)
}
print(myValue)
print(doubleValue(value : &myValue))  //출력 값? 레포트
print(myValue)

//
10
20
20
   출처:iOS프로그래밍기초 (22-2학기)한성현교수님 강의 내용 변형 및 요약 5주차
profile
초보개발자..ㅠ

0개의 댓글