묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
수업자료 압축
안녕하세요. 오늘부터 강의를 들으려고 합니다.강의자료를 다운받고 압축을 해제하는 과정에서 문제가 발생하여 수업자료를 볼 수 없습니다.혹시 이메일로 자료를 받을 수 있을까요?
-
해결됨[Lv.2] 레벨업 - SwiftUI intermediate with Core Data
SwiftData가 Core Data를 대체하는지요?
SwiftData가 Core Data를 대체 가능한지요?대체 가능하다면 SwiftData를 먼저 배워도 괜찮은지 알고 싶습니다. 감사합니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
Model에서의 UIKit import
안녕하세요. 강의 정말 잘 듣고 있습니다.코드 import와 관련하여 궁금한 점이 생겨서 질문을 남깁니다.MVC 패턴과 관련하여 공부하다보니 Model에서는 UIKit을 import 하지 않도록 구현을 해야한다고 들었습니다. 혹시 현재 BMI 리팩토링한 코드와 같이 UIKit을 Model에서 import 하는건 문제가 없는지 알고 싶습니다. 감사합니다.
-
해결됨최신 SwiftUI와 UIKit과 함께하는 올인원 iOS 앱 개발 강의
xcode15 프리부 2개로 안보여요
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 2개로 안되고 뭘해도 저렇게 합쳐져요
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
[디자인패턴] Manager 관련 질문드립니다
안녕하세요. 추가해주신 MVVM 강의 정말 잘 듣고 있어요. 그런데, 해당 디자인 패턴에서 Manager에 관련해 궁금한 점이 생겨 질문 글을 남깁니다. 매니저 클래스는 Model과 ViewModel 중 어디에 속하는 객체인가요? 아니면 앱 전체를 동작시키기 위한 로직의 한 부분으로만 바라봐야 하나요? 그저 누구든지 로직의 한 축을 이루도록 도와주는 객체라고 보는게 맞을까요? 뷰 모델도 (어느 정도) 로직을 담당하고, 매니저 클래스도 로직을 담당한다고 생각하니 경계가 모호하다는 생각을 들어 이렇게 질문을 남기게 되었습니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
84강 Member에서 memberId 질문 있습니다.
Member에서 init할 때 memberId를 타입 저장 속성을 1씩 올라가게 해서 삼항연산자로 할당해야 한다고 하신 부분이 이해가 잘 되지않아서 질문 올립니다. 이런 식으로 Member 5개를 생성하고 memberId를 print 했을 때 같은 결과가 나오는데 테스트를 잘못한 걸까요?삼항연산자를 사용해야하는 이유가 궁금합니다.
-
해결됨[Lv.1] 누구나 할 수 있는 - SwiftUI Basic with iOS 17
NavigationView를 NavigationStack 으로 변경관련입니다.
강의 잘 들었습니다.만드신 앱에서 NavigationView를 NavigationStack 으로 변경하는 방법을 알고 싶습니다.감사합니다.
-
해결됨앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
(기초-3) 가위바위보 앱 만들기 / 코드 설정하기 - 2 (기초 앱 12강) 내 comChoice값의 자동 리셋
// // ViewController.swift // RPSGame // // Created by 윤동주 on 2023/08/23. // import UIKit class ViewController: UIViewController { @IBOutlet weak var mainLabel: UILabel! @IBOutlet weak var comImageView: UIImageView! @IBOutlet weak var myImageView: UIImageView! @IBOutlet weak var comChoiceLabel: UILabel! @IBOutlet weak var myChoiceLabel: UILabel! var comChoice:Rps = Rps(rawValue: Int.random(in: 0...2))! var myChoice:Rps = Rps.rock override func viewDidLoad() { super.viewDidLoad() comImageView.image = #imageLiteral(resourceName: "ready") myImageView.image = UIImage(named: "ready.png") comChoiceLabel.text = "준비" myChoiceLabel.text = "준비" } @IBAction func rpsButtonTabbed(_ sender: UIButton) { let title = sender.currentTitle! switch title { case "가위": myChoice = Rps.scissors case "바위": myChoice = Rps.rock case "보": myChoice = Rps.paper default: break } } @IBAction func selectButtonTabbed(_ sender: UIButton) { switch comChoice { case Rps.scissors: comImageView.image = UIImage(named: "scissors.png") comChoiceLabel.text = "가위" case Rps.rock: comImageView.image = UIImage(named: "rock.png") comChoiceLabel.text = "바위" case Rps.paper: comImageView.image = UIImage(named: "paper.png") comChoiceLabel.text = "보" } switch myChoice { case .scissors: myImageView.image = #imageLiteral(resourceName: "scissors") myChoiceLabel.text = "가위" case .rock: myImageView.image = #imageLiteral(resourceName: "rock") myChoiceLabel.text = "바위" case .paper: myImageView.image = #imageLiteral(resourceName: "paper") myChoiceLabel.text = "보" } if comChoice == myChoice { mainLabel.text = "비겼다." } else if comChoice == .rock && myChoice == .paper { mainLabel.text = "이겼다." } else if comChoice == .scissors && myChoice == .rock { mainLabel.text = "이겼다." } else if comChoice == .paper && myChoice == .scissors { mainLabel.text = "이겼다." } else { mainLabel.text = "졌다." } } @IBAction func resetButtonTabbed(_ sender: UIButton) { comImageView.image = #imageLiteral(resourceName: "ready") comChoiceLabel.text = "준비" myImageView.image = #imageLiteral(resourceName: "ready") myChoiceLabel.text = "준비" mainLabel.text = "선택하세요." // comChoice = Rps(rawValue: Int.random(in: 0...2))! } } 위와 같이 마지막에 comChoice에 대해 다시 random값 설정을 안해줘도 comChoice값이 새로 다시 랜덤값으로 변경이 됩니다. 이는 resetButtonTabbed에서 comImageView와 comChoiceLabel을 초기화하지 않았을 시에는 변경이 이뤄지지 않습니다. 이유가 무엇인지 궁금합니다.
-
미해결성공적인 진짜 iOS 개발자 되기 [기초부터 실무까지]
swift에서 import 헤더를 안해도 되는이유가 궁금합니다.
보통 다른언어의 경우 다른 클래스파일을 사용할경우 (import 클래스파일) 이런식으로 선언해주어야지만 해당 클래스파일을 사용 할수 있다고 알고있습니다. 그런데 swift의 경우 따로 (import 클래스파일) 을 해주지 않아도 사용이 가능해서 어떤 원리로 작동되는지 궁금합니다.
-
미해결앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
활용4 데이터이동과 화면전달 중 "직접세그웨이"관련문의
안녕하세요.화면이동 방법 중 직접 세그웨이 활용 시 세그웨이에 연결한 버튼을 IBAction 코드 작성필요 여부 문의입니다. 이유는 수업 참고파일 중 1.NextVC 2.BMI 파일에 다르게 구현되어있기 때문입니다.NextVC에서는 IBAction 코드가 미작성되어있고BMI파일에서는 "BMI계산하기"버튼에 대한 IBAction 코드가 작성되어있습니다.2번파일에서 prepare함수를 호출하기때문에 IBAction을 제외해도 되지 않나해서 돌려보니 에러가 납니다. 기초적인 질문일것같은데 답변 부탁드립니다. :)
-
미해결iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
main.async 작동 질문(+ vs global(),async)
안녕하세요!main.async 작동 관련하여 궁금한점이 있어 질문드립니다.대게, 네트워킹 작업과 같은 부분은 global().async로 메인쓰레드가 아닌 다른 쓰레드로 작업을 보내서 백그라운드에서 돌게 하는데, 어떻게 보면 작동하는 앱(프로세스)별로 메인 쓰레드는 하나일텐데, main.async는 어떻게 작동하는지 잘 모르겠어요.제가 이해하고 있는 부분이 맞는지도 헷갈리네요ㅠ1) 메인 쓰레드에서 서브 쓰레드로 이미지 다운로드 태스킹 보냄2) 이미지 다운로드가 끝나고 컴플리션 핸들러 실행3) main.async로 다운로드 받은 이미지로 뷰 업데이트1)~3) 과정이 대략 비동기를 활용하는 과정인데, 3)에서 main.async로 메인 쓰레드로 작업을 보냈을 때머릿속에서 도식화가 잘 안되는 것 같습니다.어느 부분 강의를 보면 좋을지 답변 부탁드립니다. 감사합니다!
-
해결됨[Lv.1] 누구나 할 수 있는 - SwiftUI Basic with iOS 17
Frame 강의에서 다른 결과물이 나와요
안녕하세요!강의를 보면서 따라했는데 결과물이 다르게 나와서 왜 이런지 여쭤보고 싶어요. 아무래도 위 status bar랑 아래가 오버래핑되는 거 같은데 어떻게 해결해야 되나요? 감사합니다.
-
해결됨[Lv.1] 누구나 할 수 있는 - SwiftUI Basic with iOS 17
Frame에 대한 개념 질문
"뷰는 자신의 콘텐트와 자신이 속한 레이아웃에 따라 자동으로 크기가 조절됩니다. 하지만 frame 수정자를 사용하여 뷰의 크기나 영역을 조절 할 수 있습니다."프레임은 해당 글과 같은 역할을 한다고 볼 수 있을거 같은데 아래 실습을 통해 추가적으로 이해를 해보려고 하면 VStack(spacing: 20){ Text("Hello World!") .font(.title) .background(Color.red) .frame(height: 100, alignment: .top) // 100프레임에 대한 컨텐츠는 위에 붙게됨 .background(.orange) .frame(width: 200) .background(Color.purple) .frame(maxWidth: .infinity, alignment: .leading) .background(Color.pink) .frame(height: 400) .background(Color.green) .frame(maxHeight: .infinity, alignment: .top) .background(Color.yellow) } 실질적으로 뷰의 크기나 영역을 frame 함수를 통해 조각조각 붙여나가는 방식으로 구현한다.라고 정리될 거 같습니다. 제가 이해한 게 맞는지 궁금합니다. 이런 식으로 조각을 붙여가면서 구현을 하는 개념으로 이해해도 되는 건지...
-
미해결앨런 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 개발자 되기 [기초부터 실무까지]
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로 작성해서 실행시켜도 같은 오류가 발생합니다.
-
해결됨iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해
dismiss 되었을 때 종료질문
섹션 3 - 1에서weak self 로 전달된 클로저는 뷰 컨트롤러가 dismiss되었을 때 클로저의 작업들이 뷰 컨트롤러 객체 안에 속해있기 때문에, 클로저의 작업도 함께 종료된다고 하셨는데.섹션 3 - 2 에서 보여주신 weak self 예제에서는 뷰 컨트롤러가 소멸되었음에도 클로저의 작업이 계속 진행되더라고요. 왜 다른 결과가 나오는지 궁금합니다.
-
미해결간단하게 만들어 보는 iOS 설정앱
IOS를 Windows에서 작성하기 위한 방법이 없을까요?
IOS, Swift를 Windows에서 만드는 방법이 있다고 알고 있습니다.물론 Mac으로 작성하는 법도 있겠지만, 사실 아이폰이 좀 비싸잖아요.그런 의미에서 Windows에서도 IOS 만드는 법 설명을 추가해 주셨으면 좋겠습니다.그러면 더 좋을거 같아요. 많은 강의에서 이런 설명이 없더라구요. ㅠㅠ