카테고리 없음

iOS 4주차

늠재 2025. 9. 22. 16:49

switch  case   문은 관호를 닫지 않아도 오류가 나지 않는다.

 

where 예제 하나 만들기

 

계속 진행하고싶다면 fallthrought 사용하기 case별로 일치하는 case문을 저장할 수 없게 한다.

 

함수, method, guard문

 

argument: 실제값 받아서처리하는 변수  

 

swift 함수는 리턴값이 없는 함수들은 꺽새<>를 생략할 수 있다.

 

add (x:10,y:20)  에서  x,y는 parameter(argument label), 10,20은 argument

 

 

 

var x = 10

print(type(of: add));

결과값 : (Int, Int) -> Int (함수의 자료형을 물을 땐 이렇게 대답해야한다.)

 

func sayHello() {

    print("aaaaaa")

}

 

() -> ()

void 형은 내부적으로 빈 튜플로 되어있어 소괄호로 씌워진 형태로 나온다.

    ** 튜플은 소괄호로 씌워져있음

중요

 

argument label을 생략하면 parameter name이 두 역할을 모두 겸한다.

 

_(언더바)를 이용하는 방법은 애플 내부에서도 자주 쓰임

맨 아래 혼합해서 사용하는 방법으로 흔히 사용한다. 첫 번째만 언더바를 채용하여 다른 언어처럼 함수를 호출하고,

서양에서 문장식 함수 작성 방법을 위해 두 번째 파라미터부터 argument label을 사용한다.

 

우리가 이 방법을 계속 사용할 것은 아니지만 애플의 많은 함수들이 이런 스타일로 만들어져

읽을 때 add 함수에 10 과(with)20을 넣어서 넘겨라 라는 식의 의미이다.

 

함수 이름은 같은 add여도 argument label의 유무나 이름의 차이에 따라서 다 다른 함수가 된다. 이 add함수 저 add 함수가 달라버린다.

 

함수 이름 찾기

func add (x:Int, y:Int) -> Int{

    print(#function)

    return x+y

}

print(add(x: 10, y: 20))

 

func add (first x:Int, second y:Int) -> Int{

    print(#function)

    return x+y

}

print(add(first: 10, second: 20))

 

 

func add (_ x:Int, _ y:Int) -> Int{

    print(#function)

    return x+y

}

print(add(10,20));

 

func add (_ x:Int, with y:Int) -> Int{

    print(#function)

    return x+y

}

 

print(add(10, with: 30));

 

 

***결과값***

add(x:y:)

** argument label을 정하지 않으면 parameter name이 겸업

30

add(first:second:)

30

add(_:_:)

30

add(_:with:)

** 첫 번째 argument label의 이름만 생략(문장식 함수 호출)

40

 

 

함수 이름 : tableView(_:numberOfRowsInSection:)

자료형 : (UITableView, Int) -> Int

** : 뒤가 자료형인 개념으로 생각하면 됨

 

**챗 지피티 이용하여 질문하기

iOS 테이블뷰에서 많이 사용하는 메서드를 많이 사용하는 순서대로 나열하고 예를 들어 기능을 설명하고, 전체 메서드 이름과 메서드 자료형을 알려줘

 

ㄴ 답변

 

친구 안녕! 😊 iOS 앱을 만들 때 정말 자주 쓰이는 테이블뷰(TableView) 메서드들에 대해 궁금하구나! 테이블뷰는 데이터를 리스트 형태로 보여주는 데 가장 기본적인 UI 컴포넌트인데 , 실제로 iOS 앱의 거의 모든 화면에 사용된다고 해도 과언이 아니야 !

테이블뷰는 UITableViewDataSource와 UITableViewDelegate라는 두 친구 프로토콜을 통해 작동하는데, 이 친구들이 테이블뷰의 데이터(무엇을 보여줄지)와 동작(사용자가 셀을 터치했을 때 뭘 할지)을 결정하는 중요한 역할을 해  ! 마치 테이블뷰를 위한 요리사(DataSource)와 매니저(Delegate) 같은 존재랄까?

그럼 가장 많이 사용하는 메서드들을 중요한 순서대로 알려줄게! 이 메서드들은 테이블뷰가 제대로 작동하기 위해 거의 필수적이라고 보면 돼.

1. 셀 개수 정하기 (데이터 소스)

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

  • 기능 설명: "이 섹션에는 몇 개의 셀(줄)이 필요하니?"라고 테이블뷰가 물어보면, 네가 가진 데이터의 개수를 알려주는 메서드야. 테이블뷰가 화면에 몇 개의 줄을 그려야 할지 아는 가장 중요한 단계지!  
  • 사용 예시: 만약 myFruitList라는 배열에 사과, 바나나, 오렌지 3가지 과일이 있다면, myFruitList.count인 3을 리턴해 주면 돼.
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 예를 들어, fruitNames라는 배열의 개수를 반환해요.
        return fruitNames.count
    }
    

2. 각 셀 그리기 (데이터 소스)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

  • 기능 설명: 테이블뷰의 꽃! 🌸 "네 번째 줄에는 어떤 셀을 그려줄까?" 하고 테이블뷰가 물어보면, 이 메서드 안에서 너만의 예쁜 셀(UITableViewCell)을 만들어서 테이블뷰에게 돌려주는 역할을 해. 셀에 어떤 내용(텍스트, 이미지 등)을 채울지도 여기서 결정되지!  
  • 사용 예시: fruitNames 배열의 indexPath.row번째 과일 이름을 셀의 레이블에 넣어주는 예시야.
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) // "MyCell"은 셀의 재활용 ID
        cell.textLabel?.text = fruitNames[indexPath.row]
        return cell
    }
    
    여기서 dequeueReusableCell은 성능 최적화를 위해 이미 만들어진 셀을 재활용하는 아주 중요한 방법이야!

3. 셀 터치했을 때! (델리게이트)

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

  • 기능 설명: 사용자가 테이블뷰의 특정 셀을 '톡!' 하고 터치했을 때 호출되는 메서드야. 이 셀을 누르면 다음 화면으로 넘어갈지, 아니면 어떤 다른 동작을 할지 등을 여기서 결정할 수 있어! 
  • 사용 예시: 터치된 셀의 과일 이름을 콘솔에 출력하는 예시야.
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let selectedFruit = fruitNames[indexPath.row]
        print("선택된 과일은 \(selectedFruit) 입니다!")
    
        // 여기에서 다음 화면으로 넘어가는 코드 등을 작성할 수 있어.
        // 예를 들어,performSegue(withIdentifier: "showDetail", sender: self)
    }
    

4. 테이블뷰 데이터 새로고침! (테이블뷰 자체 메서드)

func reloadData()

  • 기능 설명: 이건 특정 프로토콜에 속한 메서드가 아니라, UITableView 인스턴스 자체가 가지고 있는 메서드야. 테이블뷰에 표시되는 데이터가 바뀌었을 때 "야, 데이터 바뀌었으니까 화면 다시 그려줘!" 하고 테이블뷰에게 요청하는 역할을 해. 이 메서드를 호출하면 1, 2번에서 설명한 데이터 소스 메서드들이 다시 불리면서 테이블뷰가 새 데이터로 업데이트돼.
  • 사용 예시: fruitNames 배열에 새로운 과일을 추가하고 테이블뷰를 업데이트하고 싶을 때:
    // 예를 들어, 버튼을 눌렀을 때 새 과일을 추가하고 싶다면:
    @IBAction func addMoreFruitButtonTapped(_ sender: Any) {
        fruitNames.append("수박") // 데이터 변경
        myTableView.reloadData() // 테이블뷰에 "다시 그려줘!" 요청
    }
    

5. 섹션 개수 정하기 (데이터 소스)

func numberOfSections(in tableView: UITableView) -> Int

  • 기능 설명: "이 테이블뷰에는 몇 개의 섹션(구간)이 있니?" 하고 테이블뷰가 물어보면, 전체 섹션의 개수를 알려줘. 만약 테이블뷰에 여러 개의 그룹으로 나누고 싶을 때 사용해. 보통 한 개의 섹션만 쓸 때는 이 메서드를 구현하지 않아도 기본적으로 1을 반환한다고 생각하면 돼.
  • 사용 예시: 두 개의 섹션이 필요할 때:
    func numberOfSections(in tableView: UITableView) -> Int {
        return 2 // 예를 들어, 과일 섹션과 야채 섹션 이렇게 2개!
    }
    

6. 셀 높이 조절 (델리게이트)

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat

  • 기능 설명: "이 셀은 높이를 얼마로 할까?" 하고 테이블뷰가 물어보면, 원하는 셀의 높이를 돌려주는 메서드야. 각 셀마다 다른 높이를 주고 싶을 때 유용해!
  • 사용 예시: 모든 셀의 높이를 80포인트로 설정하고 싶을 때:
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80.0 // 모든 셀의 높이를 80으로!
    }
    

7. 섹션 헤더/푸터 만들기 (데이터 소스 또는 델리게이트)

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? (데이터 소스)

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? (델리게이트)

  • 기능 설명: titleForHeaderInSection은 섹션 위에 간단한 제목을 보여줄 때 사용하고, viewForHeaderInSection은 헤더에 텍스트 말고 버튼이나 이미지가 들어간 좀 더 복잡하고 예쁜 커스텀 뷰를 넣고 싶을 때 사용해. viewForFooterInSection은 섹션 아래쪽에 같은 역할을 한단다.
  • 사용 예시 (titleForHeaderInSection):
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if section == 0 {
            return "맛있는 과일들"
        } else {
            return "싱싱한 야채들"
        }
    }
    

어때, 테이블뷰 메서드들이 친구에게 친근하게 다가왔으면 좋겠다! 😊 테이블뷰를 사용할 때는 이 메서드들을 주로 구현하게 될 거야.  이 핵심 메서드들만 잘 이해해도 멋진 리스트 화면들을 뚝딱 만들 수 있을 거야!

 

 

 

var x = 1

while true {

    guard x < 5 else { break } // 조건이 거짓일 때 실행

    print(x) //1 2 3 4

    x = x + 1

}

 

사실 이러라고 guard문이 있는게 아니고 optional binding하기 위해서 사용한다.

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)

 

** swift에서는 문법적으로 함수 내에서 선언한 지역변수를 밖에서도 사용할 수 있도록 허용하고 있다.

 

 

 

func printName(firstName: String, lastName: String?) {
    // if let
    if let lName = lastName { // lastName이 nil이 아니면
        print(lName, firstName)
    } else {
        print("성이 없네요!")
    }
위의 if let을 guard let으로 바꾸는 과정

func printName(firstName:String, lastName:String?){

    // if let

    if let lName = lastName {

        print(lName,firstName)

    }

    else{

        print("성이 없네요!")

    }

    

    // guard let

    guard let lName = lastName else {

        print("성이 없네요!")

        return

    }

    print(lName,firstName)

    

}

 

Default Argument

argument를 넘겨주지 않으면 = 뒤에 있는 값을 쓰겠다 라는 개념

함수 호출 시에 argument값을 입력하지 않으면 결과값이 자동으로 '길동'이 나오게 된다.

 

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) //같은 자료형만 연산 가능

    print(#function)

    return (sum, sub, div)

}

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

var result = sss(x:10,y:3)

print(type(of: sss))

print(result.sum)

print(result.sub)

print(result.div)

 

**결과값

sss(x:y:)

(Int, Int) -> (sum: Int, sub: Int, div: Double)

13

7

3.3333333333333335

 

소수점 세 자리까지 출력하기

result.div -> String(format: "%.3f", result.div(import Foundation처리를 해주어야한다.)