묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
클로저
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 앨런님 제가 강의를 순서대로 듣는게 아니고 중간 중간 듣고 있어서 질문 드립니다! 혹시 강의에 클로저와 escaping 부분을 추가적으로 설명해주시는 부분들도 따로 있나요?강의 중간중간 이전에 이 부분은 설명했다고 나오는데, 확실히 어딘지 알 수가 없어서 질문 드립니다!
-
미해결
스위프트, UIKit 에서 테이블 뷰 내 텍스트뷰 높이 조절
지금 당근마켓의 내물건 팔기를 구현하고 있습니다. 전체적으로 UITableView로 만들고 각 셀마다 맞는 셀을 구현했습니다. 텍스트 뷰에 글을 작성하면 텍스트뷰의 높이가 글자 수에 맞춰 늘어나는데, 이때 키보드는 화면 하단에 고정되어 있는것으로 판단됩니다. 그래서 아래와 같이 구현해봤습니다. class FeedViewController: UIViewController { // MARK: - Variable private let tableSection: [String] = ["이미지", "제목", "내용"] var selectedImages: [UIImage] = [] // MARK: - UI Components private let feedTableView: UITableView = { let tableView = UITableView(frame: .zero, style: .insetGrouped) tableView.separatorStyle = .none tableView.showsVerticalScrollIndicator = false tableView.alwaysBounceVertical = false tableView.isScrollEnabled = true return tableView }() ... // MARK: - Layout private var feedTableViewBottomConstraint: NSLayoutConstraint! private var registerButtonTopConstraint: NSLayoutConstraint! private func configureConstraints() { view.addSubview(feedTableView) view.addSubview(registerFeedButton) feedTableView.translatesAutoresizingMaskIntoConstraints = false registerFeedButton.translatesAutoresizingMaskIntoConstraints = false // 제약 조건 저장 feedTableViewBottomConstraint = feedTableView.bottomAnchor.constraint(equalTo: registerFeedButton.topAnchor, constant: -10) registerButtonTopConstraint = registerFeedButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10) NSLayoutConstraint.activate([ // 테이블뷰 제약조건 feedTableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), feedTableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), feedTableView.topAnchor.constraint(equalTo: view.topAnchor), feedTableViewBottomConstraint, // 버튼 제약조건 registerFeedButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 15), registerFeedButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -15), registerFeedButton.heightAnchor.constraint(equalToConstant: 50), registerButtonTopConstraint ]) // 키보드 노티피케이션 설정 setupKeyboardNotifications() } private func setupKeyboardNotifications() { NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) } @objc private func keyboardWillShow(_ notification: Notification) { if let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect { // 키보드가 올라오면 테이블뷰의 bottom을 키보드의 top에 맞춤 feedTableViewBottomConstraint.constant = -keyboardFrame.height + 100 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } } @objc private func keyboardWillHide(_ notification: Notification) { // 키보드가 내려가면 테이블뷰의 bottom을 버튼의 top으로 복원 feedTableViewBottomConstraint.constant = -10 UIView.animate(withDuration: 0.3) { self.view.layoutIfNeeded() } } 그리고 ContentInputCell 이라고해서 텍스트뷰를 입력하는 곳에는 아래와 같이 작성했습니다. // MARK: - UI Component private let contentTextView: UITextView = { let textView = UITextView() textView.text = "오늘 하루는 어땠나요? 😀" textView.backgroundColor = .systemBackground textView.layer.cornerRadius = 5 textView.layer.masksToBounds = true // 글자 수에 따라 크기가 늘어가게 하기 위함 textView.isScrollEnabled = false textView.textAlignment = .left textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) textView.textColor = .secondaryLabel textView.backgroundColor = .systemBackground textView.font = UIFont.systemFont(ofSize: 16, weight: .bold) return textView }() ... private func configureConstraints() { contentView.addSubview(contentTextView) contentTextView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ contentTextView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentTextView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentTextView.topAnchor.constraint(equalTo: contentView.topAnchor), contentTextView.bottomAnchor.constraint(equalTo: contentView.keyboardLayoutGuide.topAnchor, constant: 5), contentTextView.heightAnchor.constraint(greaterThanOrEqualToConstant: 350) ]) } // MARK: - Extension: UITextViewDelegate extension ContentInputCell: UITextViewDelegate { func textViewDidChange(_ textView: UITextView) { guard let tableView = tableView else { return } let contentSize = textView.sizeThatFits(CGSize(width: textView.bounds.width, height: .infinity)) if textView.bounds.height != contentSize.height { tableView.contentOffset.y += contentSize.height - textView.bounds.height UIView.setAnimationsEnabled(false) tableView.beginUpdates() tableView.endUpdates() UIView.setAnimationsEnabled(true) } } } extension ContentInputCell { var tableView: UITableView? { var view = superview while view != nil && !(view is UITableView) { view = view?.superview } return view as? UITableView } }
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
ThreadSafe하지 않을때 해경 방법
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요안녕하세요 앨런님 수업을 듣다가 궁금한 점이 생겨서 질문 드립니다! Thread Safe하지 않을 때의 해결 방법이 다시 시리얼큐로 보내는 방법이라고 하셨는데 이때 Task 전체를 다 큐로 보내는 건가요?? 아니면 힙 메모리에 동시에 접근하는 그 일부의 작업만 보내는 건가요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
com()이 붙는이유
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 앨런님 ! 혹시 강의 준 문법 179강에서 아래와 같은 예시를 들어주셨는데요! func doSomething(com: @escaping(Void) -> Void) {DispathchQueue.global().async {print("프린트시작")sleep(3)print("프린트 종료")com()}}print("1")doSomething()print("2")해당 함수에서 꼭 com()컴플리션 핸들러가 들어가야 하나요? 아니면 해당 예시에서는 없어도 되는 걸까요?
-
미해결TCA(The Composable Architecture) 실전 가이드
router 관련 문의 드립니다.
만약 탭이 a, b, c가 있다면 coordinator를 탭에 각각 만드나요?그리고 a, b, c 탭에서 공통적으로 사용하는 뷰가 있고 그 뷰에서 1, 2, 3이라는 뷰를 부를수 있다면 이것들도 모두 a, b, c 의 coordinator에 각각 명시를 해줘야 하는 것인지요?
-
해결됨iOS Clean Architecture & MVVM: RxSwift 완전 정복
유즈케이스 프로토콜과 구현체의 분리 이유
덤벨로퍼님 안녕하세요! 덕분에 좋은 강의 잘 듣고 있습니다!!유즈케이스의 경우 프로토콜과 구현체를 분리해서 구현하셨고, 보통 다른 사람들도 분리해서 구현하더라구요.만약 기능 단위로 유즈케이스를 구현하게 된다면 굳이 프로토콜과 구현체를 분리안해도 될 것 같은데, 둘을 분리하여 얻을 수 있는 이점이 궁금합니다!의존성 관리 측면에서 이점이 있다고 생각은 되는데 잘 와닿지가 않아서요ㅠㅠ답변해주시면 감사하겠습니다 :)
-
해결됨Part1: 진짜 왕초보 iOS 배우기(SwiftUI, SwiftData, 2024)
콘솔창에 값이 안찍히고 있습니다.
안녕하세요. 선생님좋은 강의 너무 잘 듣고 있습니다.wordRelay 실습 중인데, 하단 콘솔에 Executable 이나 Preview 영역에 값이 안찍히고 있어서요.입력하신단어는: aaaa 요런 값들을 확인할 수가 없네요. 에러도 안보이고요, 혹시 어떻게 해야 다시 뜨게 만들 수 있을까요?ㅜㅜ여기저기 뒤져봤는데 방법을 못찾았습니다.
-
미해결앱 개발 기초부터 실전까지 하나로 끝내는 Swift & iOS 마스터 클래스
클로저 문법최적화 확인부탁드립니다!
계산기 $9 - 문법 최적화수강중에 contains를 직접 해보라 하셔서 다른 방법으로 진행했기에 확인 부탁드립니다. // func contains(where predicate: (Self.Element) throws -> Bool) rethrows -> Bool var testarr = [1, 2, 3, 1, 2, 3]var result3 = testarr.contains(where: { (num: Int) -> Bool in // 클로저 기본형 return num > 4 // arr안에 4가 초과되는 숫자가 있는지 확인})print(result3) result3 = testarr.contains(where: { (num) in // 컴파일러가 파라미터타입과 리턴타입을 유추 할 수 있기에 생략 가능 return num > 4})print(result3) result3 = testarr.contains { $0 > 4 } // 클로저가 유일한 파라미터이고, 클로저 코드가 return밖에 없어서 ()와 return과 argument를 생략 가능print(result3)
-
해결됨앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
현재 시점에서 달라졌다고 생각되는 부분이 있으신가요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.현재 시점에서의 iOS 취업 시장 환경이 바뀌었다고 생각되는 부분이 있으실까요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
스토리 보드 옆 코드 창
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 혹시 스토리보드 옆에 코드 창을 같이 볼 수 있는 방법이 무엇인지 알 수 있을까요?! 해당 ui와 해당 viewcontroller에서 연결된 코드가 무엇인지 강사님처럼 바로 옆에서 확인하고 싶은데ㅜ 저는 스토리 보드만 떠서요! 질문드립니다 ㅜㅜ
-
해결됨앨런 Swift Concurrency for Swift 6 (Part-1)
Part 2에 대해서
안녕하세요! 좋은 강의 너무 잘 듣고 있습니다.2025년 1월 안으로 part 2 강의 제작을 마무리 하는게 목표라고 하셨던 것 같은데, 예상 일정대로 part 2도 업로드 될까요?actor와 sendable에 대해서 얼른 공부하고 싶어 기다리고 있습니다 ㅎㅎ답변 부탁드립니다!
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
강의 내용
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.혹시 강의 내용에서 오토레이아웃에 관해서도 자세히 다뤄주시나요?특히 코드로 하는 부분이요!
-
해결됨SwiftUI의 Property Wrapper(@State, @Binding...)
@Environment 질문 있습니다.
Environment 값 가져올때 역슬래시 하고 점으로 접금 하고 있는데 역슬래시는 어떤 의미를 갖고 있나요?
-
미해결iOS 개발 찍먹하기 - SwiftUI
동영상 플레이 에러
안녕하세요? '개발할 때 도움이 되는 맥앱 추천' 강의부터 'Sign in to confirm you're not a bot' 메세지와 함께 플레이가 안됩니다. 확인 부탁드립니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
강의 수강기간 연장 부탁드려도 될까요
작년 말부터 프론트엔드 개발자로 재직중이었는데깜빡하고 있다가 수강기간이 2달정도 남아서 부랴부랴 듣고 있는데요..iOS 개발자 전직에 관심이 계속 잇어서 급하게 들으면 정리가 안될거 같아서요..!수강기간 연장 부탁드려도 될까요..!!
-
해결됨토스(前) 엔지니어가 알려주는 iOS 입문 - Swift언어부터 샘플앱까지
2.1 프로그래밍 소개 14:06 let ints 질문
안녕하세요 오늘도 수업 잘 듣고 갑니다.질문이 있습니다.2.1 프로그래밍 개념소개, 14:06 29번줄 부분에 Array 데이터 타입 선언할 때 let ints = [1,2,3,4] 라고 작성하셨는데, int 랑 ints의 차이가 뭐죠? 왜 여기서는 ints를 사용해야하는 건가요? 14:08 부분에 강사님께서 "보면 ints 라는 Array 데이터 타입으로..." 라고 언급하셔서 조금 더 헷갈리는 부분이 있습니다.
-
해결됨Part1: 진짜 왕초보 iOS 배우기(SwiftUI, SwiftData, 2024)
todo 앱에서 미리 적어놨던 요소들은 왜 안나오나요?
안녕하세요! 강의 너무 잘 듣고 있습니다.todo앱 프로젝트 후반부 swiftdata 적용 실습때시뮬레이터를 돌려보는데 분명 코드에서는 todoList변수에 Todo 객체 3개를 넣어놓았는데 실행할때는 리스트에 안뜨더라구요. 왜 기존에 넣어놨던 todo들은 리스트에 안뜨는건지 너무 궁금합니다!
-
해결됨토스(前) 엔지니어가 알려주는 iOS 입문 - Swift언어부터 샘플앱까지
Main 을 못찾겠어요
안녕하세요, 오늘 처음 수강하게 된 수강생입니다.5:00 즈음에 main의 아이폰 인터페이스를 열고 따라하고 싶은데 제 xcode는 최신버전이라 그런지 main이 없더라구요. 그래서 더 이상 진행하는데 어려움을 겪고 있습니다. 사진 첨부하겠습니다.
-
해결됨Part1: 진짜 왕초보 iOS 배우기(SwiftUI, SwiftData, 2024)
Swift 6 업데이트 이후 Todo 예제 실행 오류
Todo.swift에서 'Cannot expand accessors on variable declared with 'let'; this is an error in the Swift 6 language mode' 오류가 발생합니다!
-
미해결앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해
2) 오퍼레이션큐(OperationQueue) 강의 질문입니다
2) 오퍼레이션큐(OperationQueue) 강의 15분37초 쯤 보면 필터 작업이 다 끝난다음에 append큐를 통해서 배열에 전달을 한다고 말씀하셨어요. 근데 여기 필터하려는 이미지가 5장이잖아요, 5장 모두 필터링 다 끝나고 나면 배열에 들어가는건가요 아니면 ,filterQueue는 기본적으로 동시적으로 동작하면서 각 필터 작업이 끝나는 대로 배열에 넣는건가요? filterQueue.waitUntilAllOperationsAreFinished() 코드 보면 동기(sync)적으로 동작하게 하니까 전자가 맞는거 같아보여요