• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

활용-10 앱 / 클로저 방식으로 셀에서 일어난 동작의 전달 (활용 앱85강) 질문있습니다.

24.03.12 02:29 작성 24.03.12 02:31 수정 조회수 89

0

아래는 ToDoCell과 ViewController의 코드 중 일부입니다.
1번째 코드

var updateButtonPressed: (ToDoCell) -> Void = { (sender) in }

2번째 코드

@IBAction func updateButtonTapped(_ sender: UIButton) {
        updateButtonPressed(self)
    }

3번째 코드

cell.updateButtonPressed = { [weak self] ( sender )in
self?.performSegue(withIdentifier: "ToDoCell", sender: indexPath)
        }

updateButtonPressed 함수의 매개변수를 ToDoCell로 설정하고 updateButtonPressed(self)에서 왜 자기자신을 전달하는 지 잘 모르겠습니다. performSegue를 수행하기 위해 전달받은 매개변수 Sender는(3번째 코드에서) 클로저 수행에 영향이 없지 않나요? 실제로 매개변수를 주지 않는 방식으로 코드를 수정하고 앱을 실행해 봤는데 셀의 저장과 수정에는 지장이 없더라구요.

답변 1

답변을 작성해보세요.

0

네 hoon 님!

다음 코드는 테이블뷰의 델리게이트 메서드 중에 자주 사용하는 didSelectRowAt 메서드 입니다.

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


테이블뷰의 셀을 터치했을때, 일반적으로 다음 디테일화면 등으로 넘어가는 동작을 구현하려고 할때, 이 델리게이트 메서드를 구현하죠.

첫번째 파라미터가 tableView: UITableView 로 구현되어 있는데, (일반적으로 tableView 파라미터를 잘 사용하는 일이 많이는 없는데) 왜 함수 설계를 이렇게 해놨을까요?
(지금 주신 질문하고, 아주 비슷한 컨셉의 질문이라고 생각합니다.)


결론적으로
말씀하신대로 ToDoCell 파라미터 부분을 없애도 당연히 동작은 합니다.
(이 코드에서는 굳이 ToDoCell을 사용하는 일이 없기 때문에요.)

var updateButtonPressed: (ToDoCell) -> Void = { (sender) in }


다만, ToDoCell까지 넘기는 방식으로 미리 구현해 놓으면.. 혹시나 나중에 추가적인 기능이 필요해져서.. 앱을 업데이트를 하는 경우.. (ToDoCell을 이용할 일이 생기면..) 수고가 줄어듭니다.

그리고 또한 일반적으로 동작이 일어나는 객체(여기서는 ToDoCell)까지 전달하는 방식으로 델리게이트 등의 메서드를 설계하는 방식이 (위에서 보여드린대로) 주로 애플의 구현 방식입니다.

애플이 미리 구현해놓은 여러가지 (테이블뷰, 텍스트필드, 컬렉션뷰, 피커뷰 등) 모든 델리게이트 메서드들을 살펴보시면, 항상 첫번째 파라미터는 그 동작이 일어나는 객체를 전달합니다.
(향후 여러가지 가능성을 고려해서, 미리 그렇게 설계해 놓은 것이겠지요.)


여기서는 ToDoCell 파라미터 부분을 없애도 동작은 하는데, (1) 일반적으로 애플 구현 방식을 많이 따르기도 하고 (2) 향후 업데이트 등을 고려했을때 미리 그렇게 만들어 놓으면 리팩토링 등의 상황에서 더 자유롭기 때문에 그런 방식을 미리 보여드린 것 뿐입니다.

이 코드에서는 지우셔도 무방하긴 하니, 선택적으로 적용하시면 됩니다.



감사합니다. :)

hoon님의 프로필

hoon

질문자

2024.03.12

앨런님 답변 감사합니다.
예시를 들어주셔서 더 이해가 잘 되네요.
늦은 시간임에도 불구하고 이렇게 빨리 답변 해주시다니 감사합니다! :)