안녕하세요, 강사님! 학습 내용과는 조금 다른 질문이라 조심스럽지만, 진로에 대한 고민이 커서 여쭤보고 싶습니다. 저는 보안학과에 재학 중이고, iOS 개발자로 취업하는 것을 목표로 하고 있습니다. 다만 최근 개발 시장이 전반적으로 어려워졌다는 이야기를 많이 접하고 있습니다. 특히 iOS 분야는 신입 채용이 매우 적고, 국내뿐 아니라 해외에서도 경력자들의 이직이 예전보다 쉽지 않다는 의견을 자주 보게 되었습니다. 또한 "지금 다시 시작한다면 iOS보다 백엔드로 커리어를 시작했을 것 같다"거나, "2026년 기준으로는 네이티브 앱 개발을 추천하지 않는다"는 현업 개발자들의 의견도 적지 않게 봤습니다. 물론 인터넷 의견이 전부 정답은 아니라는 것도 알고 있지만, 진로를 결정해야 하는 입장이다 보니 이런 이야기들을 접할 때마다 많이 흔들리게 됩니다. 그래서 강사님께 여쭤보고 싶습니다. 현재 시장 상황을 고려했을 때도 iOS 개발자를 목표로 준비하는 것이 충분히 의미 있는 선택이라고 생각하시는지, 혹은 지금 개발을 시작하는 입장이라면 미래를 위해 백엔드와 같은 다른 분야도 함께 고려해 보는 것이 좋다고 생각하시는지 강사님의 의견을 듣고 싶습니다. 강사님의 경험을 바탕으로 현실적인 조언을 해주시면 정말 감사하겠습니다.
Static property 'coin' is not concurrency-safe because it is nonisolated global shared mutable state 위와같은 에러가 아래의 코드에서 발생합니다. class KBank { static var coin: Int = 0 } 제시되는 해결법중 메인액터를 붙여서 해결은 하였는데요, 위와 같은 현상에 관한 것은 어떤 키워드로 학습하면 좋을지 여쭤봅니당 class KBank { @MainActor static var coin: Int = 0 } var regionOneKBank = KBank() var regionTwoKBank = KBank() var regionThreeKBank = KBank() KBank.coin class Banker { @MainActor func plus() { KBank.coin += 1 } @MainActor func minus() { KBank.coin -= 1 } } var banker1 = Banker() var banker2 = Banker() banker1.plus() banker1.plus() banker1.plus() banker1.plus() banker1.plus() banker1.plus() banker2.minus() KBank.coin // 다만 생성된 인스터스에서 바로 코인에 재할당하는것은 안되더라구요ㅠ_ㅠ
되게 간단한 질문인데요, 클로저 파트를 듣다보면 "함수를 클로저 형태로 만들었다.."라는 말씀을 종종 하시는데 이걸 콜백함수를 받는 함수라고 보면 되겠죠...? 함수자체는 콜백을 받는 함수로 만들고, 실행하는 구문쪽에서 클로저의 형태로 실행했다 =>로 이해해도 되려나요?.?
cal라는 함수를 옵셔널로 타입지정만 해둔채로, 타함수에서 다른 함수를 할당시키는 예제가 제 에디터에서는 에러가 나는데 원인 알 수 있을까요 func plus(n1: Int, n2: Int) -> Int { return n1 + n2 } func minus(n1: Int, n2: Int) -> Int { return n1 - n2 } var calc: ((Int, Int) -> Int)? func selectButton(type: String) { if type == "+" { calc = plus } else if type == "-" { calc = minus } } var target1 = 1 var target2 = 3 func showResult() { calc?(target1, target2) } Main actor-isolated var 'calc' can not be mutated from a nonisolated context ?
제공해주신 소스코드 main.dart 실행해보려고 하는데 chrome (web)으론 실행되는데 안드로이드 기기로는 실행이 안됩니다. FAILURE: Build failed with an exception. * Where: Script 'D:\flutter\packages\flutter_tools\gradle\app_plugin_loader.gradle' line: 9 * What went wrong: A problem occurred evaluating script. > You are applying Flutter's app_plugin_loader Gradle plugin imperatively using the apply script method, which is not possible anymore. Migrate to applying Gradle plugins with the declarative plugins block: 어떻게 수정해야 실행해볼 수 있을까요..?
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요.. 선생님 현업에 치이다... 다시 들어보려는데 ...기한이 끝나가요... 혹시 수강연장 부탁드려도될까요... 다시 주말마다 들으며 끝까지 들어보려고 합니다. 부탁드립니다..
코드는 그대로인데 강사님의 화면과 조금 다르게 생겨서 질문 드립니다. 디자인이 달리보이는건 어떤 원인일까요? 이 모양 그대로 앱이 나오는거라면, 기본제공 라이브러리 뷰의 디자인을 균일하게 리셋을 시키는 방법이 있을까요? 화면에서 이모지가 네모박스안에 물음표로 나오고있는데 이것도 혹시 원인 알 수 있을까요?
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 만약 모든 강의를 수강 완료하면 해당 강의들은 수강기간이 지나면 못듣는 걸까요??
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 선생님 안녕하세요 혹시 수강연장 부탁드려도될까요..제발요..
4-4 강의에서 fetchSite() 부분에서 import SwiftUI import Combine func fetchSite() -> AnyPublisher<Data, URLError> { guard let url = URL(string: "https://www.naver.com") else { return Empty<Data, URLError>().eraseToAnyPublisher() // return Fail<Data, URLError>(error: URLError(.badURL)).eraseToAnyPublisher() } let publisher = URLSession.shared.dataTaskPublisher(for: url) .map { data, response in return data } .eraseToAnyPublisher() return publisher } let subscription = fetchSite() .sink { completion in switch completion { case .finished: print("완료") case .failure(let error): print("에러: \(error.localizedDescription)") } } receiveValue: { data in print(data) } print("123") 위와 같은 코드 실행 시 콘솔에 아무것도 안뜹니다 print("123") 은 잘 뜨는데 왜 그럴까요?
강의에서는 5:16 쯤 "프로토콜 자체가 글로벌 격리로 구현된 프로토콜의 경우, 동일한 소스파일(.swift) 인 경우 확장에 프로토콜을 채택하더라도 타입 전체가 글로벌 격리로 추론됨" 이라고 설명합니다. 하지만 동일한 파일에서 아래와 같이, extension 에 protocol 을 채택해도 타입 본체는 nonisolated context 인것을 확인할 수 있었습니다. @MainActor protocol GloballyIsolated { func updateUI(vc: UIViewController) } struct S { func updateUI2(vc: UIViewController) { // nonisolated context vc.view.backgroundColor = .red // 💥💥💥 Main actor-isolated property 'backgroundColor' can not be mutated from a nonisolated context } } extension S: GloballyIsolated { func updateUI(vc: UIViewController) { // MainActor context vc.view.backgroundColor = .red } } 설명하시는 시점과, 현재 시점의 동작이 달라진건가? 생각도 했었는데, 강의 6:58 쯤에서는 "GlobalProtocol 을 확장해서 채택한다하더라도 본체 자체는 비격리 된다" 라고 설명합니다. 즉, 동일한 코드에 대해 설명이 다른듯 하여 조금 헷갈리는 부분이 있어서요! 현재 시점에는 "프로토콜 자체가 글로벌 격리로 구현된 프로토콜의 경우, 동일한 소스파일(.swift) 인 경우 확장에 프로토콜을 채택하더라도 타입 전체가 글로벌 격리로 추론되지 않음 " 으로 동작하는것 같은데 이 부분에 대한 강의 자료가 잘못된건지, 아니면 제가 놓친 부분이 있는지 궁금합니다. 감사합니다.
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
안녕하세요, 강의 늘 잘 듣고 있습니다. 다름이 아니라, 뷰의 레이아웃을 잡아주는 과정에서 Drawing Cycle & 생성자 중 어디에 무엇을 작성해야 할지 헷갈려서 개인적으로 알아보던 중 궁금증이 생겨서 질문드립니다! Drawing Cycle에 맞추어 뷰 업데이트하는 몇가지 예시 init(생성자) subview 추가 (addSubview, stackView.addArrangedSubview) 제약 생성 + NSLayoutConstraint.activate (1회) 정적인 스타일(폰트, 색, axis, spacing 등) 즉, ‘한번 바뀌고 안 바뀔 것들’을 세팅해 준다. updateConstraints() 상태에 따라 레이아웃이 바뀔 때 (expanded/collapsed, 이미지 크기 토글, padding 변경, 어떤 뷰 숨김에 따른 높이 변경) constraint를 프로퍼티로 보관해두고 updateConstraints()에서 constant 바꾸거나 isActive 토글 필요 시 setNeedsUpdateConstraints() 호출 즉, ‘동적으로 바뀔 레이아웃’을 세팅해 준다. layoutSubviews() frame이 계산된 뒤의 후처리를 수행해줘야 할 때 (그림자 경로, cornerRadius 등 frame의 정보가 필요한 것들) 먼저 제가 정리한 바는 다음과 같습니다. 그런데, constraint를 updateConstraint() Drawing Cycle 내에서 지정해주는 강의 내 파트와 살짝 충돌이 발생하더라구요. GPT 및 개인적인 공부를 통해 확인했을 때에는, 'constraint가 여러번 중복 적용될 수도 있으므로, 동적으로 constraint를 변경할 상황이 아니라면 생성자에서 초기화해주는 것이 좋다'라고 이해했습니다. 동적으로 변경되지 않는 기본 레이아웃 제약은 생성자에서 설정하는 것이 원칙적으로 더 적절한지, 아니면 updateConstraints()에서 설정하는 방식도 올바른 패턴인지 궁금합니다. 어떤 방식이 더 권장되는지 명확히 알고 싶습니다..!
앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지
안녕하세요, 해당 강의 18:00분 경에 앨런님께서 말씀하신 '앱을 만들 때 주로 코드로 만든다'라는 말씀에 궁금증이 들어 질문 남깁니다. UIKit을 통해 앱을 제작하실 때, 스토리보드 대신 주로 이전 강의 섹션과 같이 주로 코드를 이용해 UI를 구성한다는 말씀이신가요? 스토리보드와 코드 둘 다 짧게나마 겪어본 제 입장에서는, 세그웨이를 수행하는 것 제외 스토리보드가 더욱 많은 이점이 느껴져서요. 대표적으로는 VC에 UI 관련한 코드가 없어 더욱 VC가 본인의 책임에 집중하게 된다는 생각도 들고, 코드로 UI를 짜다 보면 하나 둘 빼먹게 될 확률도 높아지는 것 같아서요(스토리보드에서는 이를 바로 에러로 잡아주지만, 코드는 잡아주지 않기도 하구요) 어떤 부분에 의해, 주로 코드로 UI를 구성하는 것을 선호하는지가 궁금합니다!