묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
[65강] MemberListManager 질문있어요.
안녕하세요. MemberListManager 클래스를 ViewController에서 인스턴스를 생성하는 과정에서 의문점이 생겨 질문글을 남깁니다. 1️⃣강의 영상에서는 별도 makeMembersList() 메소드를 불러서 홍길동, 임꺽정 등 인물 정보를 불러오고 있습니다. 하지만, makeMemersList() 메소드가 아닌 별도 이니셜라이저를 정의해 인스턴스를 생성할 때 인물 정보를 불러오도록 시도하면 인물 정보가 두 번 불러와서(초기화되서) 제일 마지막 조커의 ID가 6이 아닌 13이 되네요.class ViewController: UIViewController { // 테이블 뷰 private let tableView = UITableView() // MARK: - 관리 모델 선언 // MVC패턴을 위한 데이터 매니저 (배열 관리 - 데이터) var membersListManager = MembersListManager() // 네비게이션 바에 넣기 위한 버튼 lazy var plusButton: UIBarButtonItem = { let button = UIBarButtonItem( barButtonSystemItem: .add, target: self, action: #selector(plusButtonPressed) ) return button }() // NOTE: - lazy 변수로 선언한 이유⭐️ // - plusButton을 일반적인 프로퍼티로 선언했다면, target으로 self를 사용할 때 초기화되지 않은 self를 참조하게 되어 오류가 발생할 수 있습니다. override func viewDidLoad() { super.viewDidLoad() setupNaviBar() setupTableView() setupTableViewConstraints() setupDatas() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 뷰가 다시 나타날 때, 테이블 뷰 리로드 tableView.reloadData() }class MembersListManager { // 멤버리스트를 저장하기 위한 배열 private var membersList: [Member] = [] init() { membersList = [ Member(name: "홍길동", age: 20, phone: "010-1111-2222", address: "서울"), Member(name: "임꺽정", age: 23, phone: "010-2222-3333", address: "서울"), Member(name: "스티브", age: 50, phone: "010-1234-1234", address: "미국"), Member(name: "쿡", age: 30, phone: "010-7777-7777", address: "캘리포니아"), Member(name: "베조스", age: 50, phone: "010-2222-7777", address: "하와이"), Member(name: "배트맨", age: 40, phone: "010-3333-1234", address: "고담씨티"), Member(name: "조커", age: 40, phone: "010-4321-1234", address: "고담씨티") ] } // <...이하 생략...> 아래는 인스턴스의 생성 과정을 추적하기 위해 콘솔에 멤버 리스트를 출력한 결과입니다.0 - Optional("홍길동")1 - Optional("임꺽정")2 - Optional("스티브")3 - Optional("쿡")4 - Optional("베조스")5 - Optional("배트맨")6 - Optional("조커")7 - Optional("홍길동")8 - Optional("임꺽정")9 - Optional("스티브")10 - Optional("쿡")11 - Optional("베조스")12 - Optional("배트맨")13 - Optional("조커")테이블에는 6 ~ 13번까지 결과가 표시됩니다. ViewController에서는 분명 하나의 인스턴스만 생성했음에도, 왜 이런 결과가 출력되는 건가요? 2️⃣ 그리고 ViewController에서 plusButton 변수를 선언할 때, lazy 변수로 선언하는 이유가 무엇인가요? 대충 ViewController의 초기화 과정과 연관(ViewController 인스턴스가 만들어지기도 전에 self를 할당하면 nil로 대입?)되어 있다는 점만 알고 있는데, 정리가 안되서 그러는데 설명 부탁드려도 될까요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
변수 저장 질문
변수에 값을 할당할때 두 단계를 나누지 않고 이미지처럼 userInput을 Int형으로 전환하고 바로 저장하지 않는 이유가 있을까요???
-
해결됨앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
[58강] 실제로 앱을 만들게 된다면
안녕하세요. 강의를 수강하다 문득 드는 궁금증이 뷰에 어떠한 설정(스타일)을 한다고 할 때, 1️⃣ 모든 설정을 코드로 설정을 건드리면 좋을지, 아니면 2️⃣Attribute Inspector로 설정을 건드리면 좋은지 고민이 들어 질문을 남기게 되었습니다. 예를 들어, UILabel의 폰트 크기를 바꾼다고 할 때, 1️⃣과 2️⃣ 방법 모두 사용할 수 있습니다. 이때, 강사님께서는 어느 방법을 더 선호하시는 편인가요?
-
미해결해커를 위한 iOS 앱 모의 해킹 전문 과정
안녕하세요. 금융권 앱을 진단해보려구 하는데요.
안녕하세요. 금융권 앱을 진단해보려고 하는데요. iphone 6+의 경우 마지막으로 지원하는 iOS 버전이 12.x인데 금융권 앱들은 13.x 이나 14.x iOS 이상에서만 설치가 가능하더라고요. 최근에 앱 진단하실 때는 어떤 기종을 사용하시는지 알 수 있을까요?
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
closure 3 에서 weak로 준 부분이 궁금합니다.
안녕하세요.레퍼런스 변수의 경우 레퍼런스 카운터에 의해 메모리에서 해제 되는 시점을 확인 한다고 이해 했는데요.캡쳐 리스트에서 weak self 를 사용 할 경우 레퍼런스 카운터가 증가하지 않게 되고그래서 클로저 변수를 메모리에서 해제 하지 않아도 결국 클래스의 deinit이 호출되는것을 확인 하였습니다.그렇다면 weak를 사용해 캡쳐 된 레퍼런스 변수들은 메모리에 그대로 남아 있는건가요?아니면 클래스인스턴스에서 레퍼런스 카운터가 0이 될 때 메모리에서 weak로 참조된 변수들도 같이 해제 되는건지 궁금합니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용-3 앱 / 코드로 UI짜기 오류 질문입니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 로그인 화면 만드는 코드에서, 오토 레이아웃을 설정했습니다. 실행을 시키면 버튼이 나와야 하는데, Thread 1: "Unable to activate constraint with anchors <NSLayoutXAxisAnchor:0x60000039b680 \"UILabel:0x14f10d260.leading\"> and <NSLayoutXAxisAnchor:0x600000398a00 \"UIView:0x14f127660.leading\"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal." 라는 오류가 발생합니다. 어떻게 해결하면 될까요?? NSLayout이 문제인 거 같아, 사용하지 않고 .isActive = true로 작성해서 실행시켜도 같은 오류가 발생합니다.
-
미해결Flutter 초급 - Http통신, 상태관리
[네이티브연동 관련 질문]
kotlin MainActivity에 강의에서 알려주신대로 쳤는데 왜 오류가 날까요?근데 일단 실행은 문제가 없었습니다.
-
해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
dismiss 되었을 때 종료질문
섹션 3 - 1에서weak self 로 전달된 클로저는 뷰 컨트롤러가 dismiss되었을 때 클로저의 작업들이 뷰 컨트롤러 객체 안에 속해있기 때문에, 클로저의 작업도 함께 종료된다고 하셨는데.섹션 3 - 2 에서 보여주신 weak self 예제에서는 뷰 컨트롤러가 소멸되었음에도 클로저의 작업이 계속 진행되더라고요. 왜 다른 결과가 나오는지 궁금합니다.
-
미해결배달앱 클론코딩 [with React Native]
앱 성능 측정은 어떻게 해야하나요?
React-Native로 개발한 앱을 리팩토링하려합니다.성능 비교를 위해서 리팩토링 이전에 측정해놓고 싶습니다.웹의 경우 라이트하우스로 성능을 측정했다면 모바일앱은 어떤걸로 측정 해야하나요?찾아보니까 Firebase Performance가 앱 성능 측정을 해주던데 표준이 되는 다른 측정 도구가 있나요? 아님 firebase를 활용해서 측정하면 될까요?
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
(기초-3)가위바위보 앱 만들기 - 기초 앱 강의 12강 질문입니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.강의 코드를 모두 동일하게 작성을 했는데 comChoice의 값이 랜덤으로 바뀌지를 않는 거 같아요. myChoice는 select를 누를 때마다 변하는데, comChoice는 처음 값만 그대로 가고 변하지를 않습니다. 어떤 부분이 문제인가요?? // // ViewController.swift // RPSGame // // Created by Gahyun Kim on 2023/07/12. // import UIKit class ViewController: UIViewController { //변수 / 속성 @IBOutlet var mainLabel: UILabel! @IBOutlet var comImageView: UIImageView! @IBOutlet var myImageView: UIImageView! @IBOutlet var comChoiceLabel: UILabel! @IBOutlet var myChoiceLabel: UILabel! var myChoice = Rps(rawValue: Int.random(in: 0...2))! var comChoice = Rps(rawValue: Int.random(in: 0...2))! //함수 / 메서드 //앱의 화면에 들어오면 처음 실행되는 함수 override func viewDidLoad() { super.viewDidLoad() // 1) 첫번째/두번째 이미지뷰에 준비(묵) 이미지를 띄워야 함 comImageView.image = #imageLiteral(resourceName: "ready") myImageView.image = UIImage(named: "ready.png") // 2) 첫번째/두번째 레이블에 *준비*라고 문자열을 띄워야 함 comChoiceLabel.text = "준비" myChoiceLabel.text = "준비" } @IBAction func rpsButtonTapped(_ sender: UIButton) { // 가위/바위/보(enum)를 선택해서 그 정보를 저장해야함 //버튼의 문자를 가져옴 guard let title = sender.currentTitle else { return } print(title) switch title { case "가위" : myChoice = Rps.scissors case "바위" : myChoice = Rps.rock case "보" : myChoice = Rps.paper default : break } } @IBAction func selectButtonTapped(_ sender: UIButton) { // 1) 컴퓨터가 랜덤으로 선택한 것을 이미지뷰에 표시 // 2) 컴퓨터가 랜덤으로 선택한 것을 레이블에 문자열로 표시 switch comChoice { case Rps.rock : comImageView.image = #imageLiteral(resourceName: "rock") comChoiceLabel.text = "바위" case Rps.paper : comImageView.image = #imageLiteral(resourceName: "paper") comChoiceLabel.text = "보" case Rps.scissors : comImageView.image = #imageLiteral(resourceName: "scissors") comChoiceLabel.text = "가위" } // 3) 내가 선택한 것을 이미지뷰에 표시 // 4) 내가 선택한 것을 레이블에 문자열로 표시 switch myChoice { case Rps.rock : myImageView.image = #imageLiteral(resourceName: "rock") myChoiceLabel.text = "바위" case Rps.paper : myImageView.image = #imageLiteral(resourceName: "paper") myChoiceLabel.text = "보" case Rps.scissors : myImageView.image = #imageLiteral(resourceName: "scissors") myChoiceLabel.text = "가위" } // 5) 컴퓨터가 선택한 것과 내가 선택한 것을 비교해서 이겼는지/졌는지 판단해서 문자열로 표시 if comChoice == myChoice { mainLabel.text = "비겼다" } else if comChoice == .rock && myChoice == .paper { mainLabel.text = "이겼다" } else if comChoice == .paper && myChoice == .scissors { mainLabel.text = "이겼다" } else if comChoice == .scissors && myChoice == .rock { mainLabel.text = "이겼다" } else { mainLabel.text = "졌다" } } @IBAction func resetButtonTapped(_ sender: UIButton) { // 1) 컴퓨터가 다시 처음 준비 이미지뷰에 표시 // 2) 컴퓨터가 다시 준비 레이블에 문자열로 표시 comImageView.image = #imageLiteral(resourceName: "ready") comChoiceLabel.text = "준비" // 3) 내 선택 이미지뷰에도 준비 이미지를 표시 // 4) 내 선택 레이블에도 준비 문자열 표시 myImageView.image = #imageLiteral(resourceName: "ready") myChoiceLabel.text = "준비" // 5) 메인 레이블 *선택하세요* 표시 mainLabel.text = "선택하세요" // 6) 컴퓨터가 다시 랜덤 가위/바위/보를 선택하고 저장 comChoice = Rps(rawValue: Int.random(in: 0...2))! } }
-
미해결Flutter 중급 1편 - 클린 아키텍처
freezed 파일 생성하기 위해 build_runner build 시 NullThrownError 발생
질문은 아니고 해결 방법 공유 드립니다.build_script_generate/bootstrap.dart:76:40: Error: Method not found: 'NullThrownError'. final error = e[0] as Object? ?? NullThrownError();위 에러가 발생하는 경우 https://pub.dev/ 에서 사용하는 라이브러리들을 검색해서 버전들을 최신으로 맞춰주시면 됩니다.발생 원인은 NullThrownError 가 Dart 2.14 이후에 제거되었는데 예전 버전들에서 저 메서드를 사용하려고 하니 발생하는 것이 아닐까 싶습니다.
-
해결됨Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
Firebase로 이메일 로그인 기능 구현
올려주신 방법 모두 해봤는데 안돼서 질문드립니다ㅠ
-
해결됨Flutter 초입문 왕초보편
슬라이드가 작동하지 않습니다.
다른분들은 문제없이 잘 되나요??
-
미해결[iOS] Swift Modern Collection View & MVVM 패턴 가이드
모든 강의 수강 후 종합적으로 궁금한 내용에 대해 질문드립니다.
안녕하세요 좋은 강의 감사합니다!강의를 모두 수강하고 궁금한 점이 있어서 질문글을 작성합니다.DiffableDataSource에 사용되는 Section과 Item의 경우 ViewController에 작성하는 것을 많이 봐왔는데 ViewController가 아닌 다른 swift 파일에 정의를 해도 흐름에는 문제가 없겠지요?예를 들면 ViewModel 같은 곳에서 dataSource를 적용해서 View에 넘겨준다고 한다면 ViewModel에 작성하는게 가독성이 있는 것인지에 대해 궁금합니다.CellRegistration으로 셀을 등록하는 것과 register로 셀을 등록하는 것의 차이가 있을까요?구글링을 해보니 collectionView를 xib파일이나 코드로 작성하는 경우에는 register로 셀을 등록한다고 하는데 제가 진행했던 프로젝트에서 코드베이스로 DiffableDataSource를 사용해서 collectionView의 셀을 등록할 때 CellRegistration으로 했어도 별 문제가 없었던 것이 기억이 나서 질문 드립니다.CompositionalLayout으로 Layout 그리실 때 HeightDemension의 경우 absolute로 하시던데 이건 케바케 일까요? absolute로 설정하게 될 경우 작은 사이즈의 디바이스에 대응하는 것이 어렵지 않을까 하는 생각이 들었습니다. 현업에서도 fractional 말고 absolute나 estimated로 그리는 경우가 어느 정도 있는지 알고 싶습니다.제너릭한 Network 클래스를 작성하실 때 get 메소드에 대한 코드가 있는 이유는 사용하신 API에서 get 메소드만을 사용하기 때문이라고 생각하고 있습니다.만약 post나 patch 같은 HTTP 메소드를 사용한다고 하면 각각에 대응하는 메소드를 만들어서 써야하는 것인지 궁금합니다. 제너릭하다고 하셔서 다양한 HTTP 메소드에 대응 할 수도 있다고 생각했는데 get 메소드에 대한 코드만 있어서 이 부분이 궁금했습니다.APIKEY와 같이 보안이 중요한 것들은 현업에서 어떤 식으로 관리하는지 궁금합니다. Info.plist에 두는 방법도 본 적이 있는 것 같은데 그외 현업에서 관리하는 방법을 알고 싶습니다. 쓰고보니 질문이 너무 많네요 ㅎㅎ;;다음 강의도 현업의 노하우를 전수해주는 강의가 되었으면 합니다.감사합니다.
-
미해결개발하는 정대리 스위프트 기초 문법
Xcode 단축키, 강의 내용 개인 블로그 공유 문의 드립니다.
안녕하세요.애플 환경은 처음이라 아직도 ctrl + c / v 가 익숙합니다. 강의 따라 코딩 하다보니 Xcode 단축키를 알면 더 생산성이 좋지 않을까 싶은데 강사님께서 꼭 필요하다고 생각되는 단축키 공유 부탁드려도 될까요 ?그리고 강의 내용 개인블로그에 올려도 될까요 ? 유튜브 링크하고 출처도 같이 올리겠습니다.^^
-
미해결Flutter 초급 - Http통신, 상태관리
네이티브코드 연동할때 네이티브 디버깅은 어떻게 하나요?
안녕하세요.플러터에서 네이티브 MainActivity.kt 연동할때디버깅 모드에서 코틀린 코드에 브레이크를 걸었는데 네이티브로에서는 디버깅이 걸리질 않네요.플러터에서 네이티브 호출할때 네이티비에 디버깅을 어떻게 걸어서 실행해야 하나요?
-
미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
'동기'와 '동시성 프로그래밍'에 대해 질문드립니다.
안녕하세요 앨런(Allen)님!수강 중 질문이 생겨 처음 인사드립니다.[섹션0.GCD - 1.GCD/Operation에 앞서] 강의까지 듣고 동기(Sync)는 동시성 프로그래밍(Concurreny Programming)이 아닌 건지 질문드립니다.-2개 이상의 프로세스가 동시에 작업하는 것이 ‘동시성 프로그래밍(Concurreny Programming)’이고 IOS에서 이러한 동시성 프로그래밍을 사용하기 위해 작업을 대기행렬(Queue)에 보내며, 대기행렬(Queue)은 직렬(Serial)과 동시(Concurrency)이라는 특성을 가지고 있다고 이해했습니다.이 과정에서 동기(Sync)는 작업을 다른 스레드(Thread)에서 하도록 시킨 후, 기다렸다가 다음 일을 진행한다고 설명해 주셨는데 그렇다면 동기(Sync)는 동시성 프로그래밍(Concurreny Programming)이 아닌 건지 확실하게 확인하고 넘어가면 좋을 것 같아 질문을 드리게 되었습니다.추가로 대기행렬(Queue)의 특성 중 직렬(Serial)은 작업을 분산시킨 *메인 스레드(Thread)가 있기 때문에 동시성 프로그래밍(Concurreny Programming)으로 볼 수 있다고 이해했는데 이해한 내용이 맞는지도 함께 답변 주시면 큰 도움이 될 것 같습니다.*강의 영상에서 말하는 Thread1을 작성한 것입니다.-혹시 제가 잘못 이해한 부분이 있으면 함께 답변 남겨주시면 감사하겠습니다 :)
-
해결됨아키텍처 패턴 with iOS - GUI Architecture Patterns(이론)
MVVM 템플릿2 관련
강의를 여러번 다시 들으니 MVVM에 대해 조금 더 이해하게 된것 같습니다.다만 강의를 여러번 다시 들었는데도 응용하기가 조금 어려워서 질문드립니다.PostViewController와 PostViewModel 처럼 뷰컨트롤러나 하위뷰 들도 그저 내용만 표시하는것이라면 강의내용을 따라서 잘 응용하고있습니다.하지만 하위 뷰들에서 input과 output이 추가된다면 어떻게 응용해야할지 잘 모르겠습니다.예를 들어 예제의 PostTableViewCell 에서는 titleLabel과 detailsLabel 밖에 없지만 PostTableViewCell에 textFeild와 같은 input이 추가되고 셀에서 입력한것이 상위뷰인 PostViewController에 표시된다고 했을 때제가 생각했을 때는 PostTableViewCell에서 상위뷰로 데이터를 전달하려면 PostViewModel을 알아야할것 같은데 제가 생각하기엔 이렇게 하는 방법밖에 없는것 같은데final class PostsViewModel: ViewModelType { ... let postTableViewCellInput = PublishSubject<String>() ... } final class PostTableViewCell: UITableViewCell { ... @IBOutlet weak var textField: UITextField func bind(_ viewModel: PostsViewModel) { viewModel.postTableViewCellInput .bind(to: textField.rx.text) .disposed(by: disposeBag) } }이렇게 코드를 짜면 PostTableViewCell이 상위 뷰모델을 받고 PostsViewModel도 하위 뷰의 데이터를 직접 전달받기 때문에 올바른 방법이 아닌것 같아 PostItemViewModel에 Input Output을 받는것으로 수정해보려 했지만 PostItemViewModel의 Intput output을 어떻게 설정해야 PostViewModel에서 하위뷰에서 입력한 데이터를 상위뷰에서 사용할 수 있을지 감이 안잡혀서 질문드립니다
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
기초앱 12강 가위바위보 앱 viewDidLoad() 함수 내부 구현 질문
안녕하세요 강의 잘 듣고있습니다!!제가 가위바위보 앱을 강의 보면서 따라만들때는 이 오류가 안떴는데 혼자 복습하면서 만들다보니 viewDidLoad 함수 내부에서 comImageView.image = #imageLiteral( 준비 이미지를 설정하는데 빌드를 하면 오류가 뜹니다.오류는 : Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value라고 뜨는데 comImageView.image 에 준비 이미지를 넣어줬는데도 왜 옵셔널이라 뜨는거죠..? 원본 코드랑 비교해도 다른 점이 없고 구글링해도 안나와서 질문드립니다ㅠㅠ답변해주시면 감사하겠습니다!아래는 제 ViewController 화면입니다
-
미해결iOS SwiftUI AR 증강현실
해당 파일을 usdz 파일로 내보내기가 가능한가요?
안녕하세요 궁금점이 있어서 글 남깁니다.이번 wwdc 2023에서 오브젝트 캡쳐 기능이 추가 되었는데요.이 usdz파일은 애니메이션이 없어 그냥 오브젝트입니다. 따라서 여기서 애니메이션이 추가 하는 방법이 있나요? (usdz 애니메이션) 또 지금 강의에서 작업한 것을 usdz파일로 내보내는 방법이 있을까요? 궁금합니다.