iOS, Swift에 대한 책을 쓰고 강의를 하고 있는 iOS 개발자입니다 :)
앱 개발 교육사이트인 KxCoding을 운영하면서 iOS 개발자를 꿈꾸는 다양한 분들과 공부하고 있습니다
지금까진 쓴 책들
2019.4 - Hello, Swift (iBooks)
2017.9 - iOS 앱 개발자를 위한 Swift 4
2016.10 - iOS 앱 개발자를 위한 Swift 3
2014.12 - Objective-C 개발자를 위한 Swift
강의 및 세미나
Fast Campus 나만의 iOS 앱 개발 캠프
Fast Campus Swift 4를 활용한 iOS 앱 개발 캠프
Fast Campus Dev Seminar: 좋았을걸
한화생명 iOS 앱 개발 기초 과정
KxCoding 부트 캠프
講義
受講レビュー
投稿
Q&A
타이머 오차
기본적으로 asyncAfter에서 약간의 오차(0.1초 이내)가 발생할 가능성이 있습니다.이것보다 큰 오차가 발생한다면 코드에 문제가 있거나, 맥 자체의 리소스가 부족해서 프리뷰에서 딜레이가 발생할 가능성이 있습니다.시뮬레이터 또는 실제 디바이스에서 실행해보시고 오차가 0.1초 이내라면 프리뷰의 오차는 무시하셔도 됩니다. 여전히 동일한 수준의 딜레이가 발생한다면 코드를 다시 한 번 점검해 보시기 바랍니다.
- 0
- 2
- 46
Q&A
수업 중 궁금한 부분이 있습니다.
Auto Layout은 “뷰의 위치(x · y)와 크기(width · height)를 계산하기에 충분한 정보만 있으면 된다”는 규칙으로 작동합니다. 그래서 어떤 뷰에선 top·leading만 걸고, 또 다른 뷰에선 top·leading·trailing을 추가로 거는 식으로 설정이 달라집니다. 그 기준은 크게 두 가지입니다.1. 뷰를 어떻게 배치할지에 따라 다릅니다예를 들어, “왼쪽 상단에 달라붙어만 있으면 되고, 폭은 글자 길이에 맞춰 자연스럽게 늘어나도 된다”면 top·leading만으로 충분합니다. 반면 “왼쪽에서 시작하되, 오른쪽 여백(trailing)까지 꽉 차게 늘어나야 한다”거나 “부모 뷰 양쪽에 딱 붙어야 한다”면 trailing 제약도 추가해 폭을 확정해 줘야 합니다.2. 그 뷰가 ‘고유 콘텐츠 크기(intrinsic content size)’를 갖고 있는지도 중요합니다UILabel·UIImageView처럼 콘텐츠 자체로 너비·높이를 추정할 수 있는 뷰라면, 위치만 고정해 줘도 나머지 한 변(너비 또는 높이)은 시스템이 알아서 계산합니다. 그래서 height를 따로 주지 않아도 되는 경우가 많습니다. 반대로, 고유 크기가 없는 UIView나 “정확히 44 pt 높이여야 한다” 같은 요구 조건이 있을 때는 height나 width 제약을 반드시 명시해야 레이아웃이 모호해지지 않습니다.3. Auto Layout 챕터를 공부하시면 분명해집니다지금은 “필요한 만큼만 제약을 건다”는 감각이 다소 추상적으로 느껴질 수 있습니다. Auto Layout 챕터를 공부하시면 ‘충분한 제약 조건’이 무엇을 의미하는지, 그리고 Hugging/Compression Resistance처럼 시스템이 여백을 배분·압축하는 방식이 어떻게 결정되는지 알게 됩니다.4. 초반에는 실습을 그대로 따라 해도 충분합니다처음부터 모든 원리를 이해하고 시작하기란 쉽지 않습니다. 실습을 그대로 따라 하며 “어떤 경우에 제약을 더 걸고, 어떤 경우에 생략해도 되는지” 몸으로 익히는 편이 훨씬 빠릅니다. 경험이 쌓이면, 레이블 하나를 추가할 때도 “여기서는 trailing이 필요하겠네” 하고 자연스럽게 판단하게 되실 겁니다.
- 0
- 2
- 35
Q&A
Xcode Live Rendering 문의
Xcode 16 버전에서 해당 기능이 제거되었습니다. 실제로 Xcode 변경사항을 보면 아래와 같은 문구가 있습니다.@IBDesignable views are deprecated and will no longer be rendered in the Interface Builder canvas. (115873872)따라서, 강의와 동일한 결과를 직접 확인하고 싶다면 Xcode 15 초기 버전을 사용하셔야 합니다. 이 기능은 Xcode Previews로 점진적으로 대체되고 있는 상황이고, Xcode 16 버전에서 실습하신다면 라이브 렌더링 관련 부분은 무시하고, Custom View의 결과만 확인하시면 됩니다.
- 0
- 2
- 37
Q&A
Xcode에 gpx파일이 인식이 안됩니다.
최신 버전에서는 말씀하신 문제가 발생하고 있습니다.Xcode 15버전으로 실습을 진행해 보시기 바랍니다. 이전 버전은 Xcodes 앱을 통해서 쉽게 설치할 수 있습니다.https://www.xcodes.app/
- 0
- 2
- 126
Q&A
API 출력 오류.. 도와주세요.
message에 오타가 있습니다. mesaage가 아니라 message입니다. 모델 파일로 가서 속성 이름을 수정해 주세요.
- 0
- 2
- 72
Q&A
play ground 오류?? 원인을 알고 싶습니다.
보내주신 에러처럼 플레이그라운드 위에 표시되는 에러는 대부분 Xcode의 내부적인 에러입니다. Xcode를 완전히 종료하신 후 다시 실행하시면 대부분 해결됩니다.
- 0
- 2
- 94
Q&A
런타임 오류... 부탁드립니다.
에러 메시지로 봐서는 WKWebView가 정상적으로 링크되지 않은것 같습니다. 이 때는 아래와 같은 순서로 직접 연결해 주시면 해결됩니다.프로젝트 네비게이터에서 프로젝트 선택 타깃 선택General 탭에서 Frameworks, Libraries, and Embedded Content 섹션+ 클릭 후 WebView 검색WebKit.framework 선택 후 Add 클릭ps. 항상 열심히 공부해 주셔서 감사합니다. 마지막 강의까지 화이팅입니다!!!
- 0
- 2
- 121
Q&A
Playground 실행중 오류
보여주신 에러는 Xcode 내부적인 에러이고 Xcode를 완전히 종료하고 다시 실행하시거나 맥 자체를 재부팅하시면 대부분 해결됩니다.간혹, CPU를 많이 사용하는 경우에도 발생하기도 합니다. CPU를 많이 사용하는 다른 앱이 없는지도 확인해 보시기 바랍니다. UIKit 임포트와 관련된 문제 역시 앞의 에러와 연결된 문제인것 같습니다. Foundation을 임포트 했을 때 문제가 없다면, UIKit을 임포트 했을 때도 문제가 없어야 합니다. 계속해서 동일한 문제가 발생한다면 코드 자체에 문법적인 오류가 있을 가능성도 있습니다. 재시작 후에도 동일한 문제가 발생한다면 전체 코드를 질문으로 등록해 주세요.
- 0
- 2
- 148
Q&A
Custom Activity Item 질문
Xcode 16 버전에서 iOS 18 시뮬레이터로 실행하셨다면, 강의에 있는 코드로는 아이콘이 표시되지 않는 것이 맞습니다.iOS 17이나 그 이전 버전 시뮬레이터로 실행해보시면 정상적으로 결과를 확인할 수 있습니다.우선 레퍼런스를 확인했을 때는 별다른 변경사항이 없는 것으로 보입니다. OS의 버그일 가능성도 있을 것 같습니다. 일단 해당 내용은 부차적인 부분이므로 다음 단계로 넘어가시는 것을 권해드립니다.나중에 해결방법을 찾게 되면 다시 답변 남기겠습니다!
- 0
- 2
- 74
Q&A
오류를 원인을 알고 싶습니다.
보여주신 코드에서는 for 문이 중첩되어 있습니다. dict[key] = timeZoneList까지만 첫 번째 for 문에 추가하고, 나머지는 아래와 같이 첫 번째 for 문 뒤에서 작성해 주세요 func setupList() { var dict = [String: [TimeZone]]() for id in TimeZone.knownTimeZoneIdentifiers { guard let city = id.components(separatedBy: "/").last else { continue } var timeZoneList = [TimeZone(identifier: id)!] let key = city.chosung ?? "Unknown" if let list = dict[key] { timeZoneList.append(contentsOf: list) } dict[key] = timeZoneList } for (key, value) in dict { let items = value.sorted { guard let lhs = $0.city, let rhs = $1.city else { return false } return lhs
- 0
- 1
- 94