[TIL / 25.03.28] 과제 5, 스택뷰가 보이지 않는 문제 해결
·
iOS/Swift
1. 메인 트러블슈팅버튼이 출력되지 않던 문제, configure 이전에 setupUI를 해주어 count가 넘어가지 않고 0인채로 렌더링하고 끝나는 줄 알았는데, 그렇다고 데이터가 후에 바인딩 되던게 여기서는 안될 리가 없었다. //// BookSeriesView.swift// HarryPotterBooks//// Created by 송규섭 on 3/28/25.//import UIKitclass BookSeriesView: UIView { private var seriesCount: Int = 0 private let stackView = UIStackView().then { $0.axis = .horizontal $0.spacing = 8// ..
[TIL / 25.03.27] HarryPotterBooks 과제 2~4Lv 구현 및 회고
·
iOS/Swift
1. 구현한 것2. 보완했던 사항들기본 구현보단 부분 부분 고쳤던 사항들을 기록한다. 먼저, 에러 핸들링에 대해서 좀 더 alert창에 친근하게 접근할 수 있도록 구조를 바꿨다.기존 loadBooks는 Result 타입을 반환했는데, 해당 방식으로 콜백을 하기보단 해당 throw 메서드로 변환하면서 [Book]으로 명시적으로 반환하도록 바꿨음.class DataService { func loadBooks() throws -> [Book] { guard let path = Bundle.main.path(forResource: "data", ofType: "json") else { throw DataError.fileNotFound } ..
HarryPotterBooks 과제 1레벨 기록
·
iOS/Swift
1. 구현해야 할 것2. 문제 해결import Foundationimport UIKitstruct BookResponse: Decodable { let data: [Book]}struct Book: Decodable { let attributes: Attributes}struct Attributes: Decodable { let title: String let author: String let pages: Int let release_date: String let dedication: String let summary: String let wiki: String let chapters: [Title]}struct Title: Decodable { ..
[TIL / 25.03.25] 제목은 gitignore 트러블슈팅으로 하겠습니다,, 근데 이제 cherry-pick, rebase를 곁들인
·
Git, Github
정신 없이 고치고 문제 해석하느라 과정에선 스샷 없이 진행합니다.. 1. 상황 설명dev 브랜치 내에 각자의 디렉토리를 생성해두고 그 안에 각자 개인과제 풀이 프로젝트를 넣어야 하는 상황.이에 따라서 디렉토리의 depth가 커져 DS_Store 파일도 그만큼 많아져서 gitignore를 최상위에서 한꺼번에 관리하자는 결론이 나왔음. 다만, 이 gitignore 작업을 내 개인 브랜치에서 할 게 아니라 dev 브랜치에 최신 사항 위에 바로 올리고 푸쉬했어야 했는데, 내 개인 브랜치에서 작업을 진행함. 뭔가 나 혼자 했다면 다시 지우고 dev 브랜치로 가서 다시 만들었을 것 같은데, 역시 깃과 깃헙에 유능한 팀원분의 지도 하에 문제 해결을 해보도록 했습니다. 2. 문제 해결우선 해결 당시에는 정말 뇌가 너무..
[TIL / 25.03.24] UIKit No Storyboard 초기 세팅
·
iOS/Swift
스토리보드 없이 코드 베이스로 UI를 구현하게 된다면 어떻게 세팅할지 알아보자 ! 1. main.storyboard 삭제move to trash 해줘야함 ! 2. 프로젝트 설정 - Build Settings - main 검색하면 나오는 UIKit Main storyboard File Base Name 백스페이스로 제거 3. 파일 중 Info.plist에서 해당 항목도 백스페이스로 제거 4. SceneDelegate 내에 코드 수정func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (..
[TIL / 25.03.20] 최적화(OptimizationTips) 2
·
iOS/Swift
1. Swift 컨테이너 타입을 효율적으로 사용하는 방법Array에서 값 타입 사용하기Swift에서 타입은 두 가지 카테고리로 나눌 수 있습니다. 값 타입과 참조 타입.값 타입은 struct, enum, tuple이 있고, 참조 타입은 class가 있는데, 값 타입의 경우 NSArray 내부에 포함될 수 없습니다.여기서 NSArray가 무엇인가? NSArray는 Objective-C에서 사용되는 불변(Immutable) 배열 클래스라고 합니다. 스위프트에선 옵젝씨와의 브릿징을 통해 사용할 수 있다고 합니다. 오직 객체(참조 타입)만 저장 가능합니다. Swift의 Array는 내부적으로 때로는 Objective-C의 NSArray와 호환되어야 한다고 합니다. 다만, 값 타입은 NSArray에 넣을 수 없는..
[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)
·
iOS/Swift
1. 오늘 무엇을 했으며 문제가 무엇인가,,,,,,오전부터 낮까지 알고리즘 문제 하나 붙잡고 있었다가 남는 시간에 무언가 몰두해서 하기 힘들어서 밀린 강의를 좀 들어두도록 했다.문제가 생긴 부분은 심화 단계에서의 클로저 실습. escaping closure(탈출 클로저)에 대한 실습인데 실행에 자꾸 문제가 있었다. 우선 탈출 클로저란 무엇인가?"탈출 클로저(@escaping)는 함수가 반환된 후에도 실행될 수 있는 클로저입니다. 즉, 클로저가 함수의 실행 범위(scope)를 '탈출'하여 함수 외부에서도 호출될 수 있습니다. 반면, 일반 클로저(비탈출 클로저)는 함수 내부에서만 실행되며 함수가 반환되기 전에 실행을 완료해야 합니다." 원래 클로저를 쓸 때 선언 시 함수 블럭 내에 쓰는데 만약 이 클로저가 ..
[TIL / 25.03.18] 최적화(OptimizationTips) 1
·
iOS/Swift
Private, public 의 쓰임새에 대해서 좀 더 고민하다가 같이 고민하던 분들과 같이 튜터님께 갔는데 최적화 관련 정보가 있는 링크를 받아 해석해보기로 했읍니다,,,,,  1. Whole Module Optimizations (WMO)기본적으로 Swift는 각 파일을 개별적으로 컴파일한다고 합니다. 이를 통해 Xcode는 여러 파일을 매우 빠르게 병렬로 컴파일할 수 있는데, 단 각 파일을 개별적으로 컴파일하게 되면 특정 컴파일러 최적화를 방지할 수 있다고 합니다. (일부 최적화를 하는 데에 방해가 된다는 느낌인듯?) 이때 파일 단위로 컴파일하지 않고 모든 파일을 하나의 단위로 컴파일하는게 WMO라고 합니다.단, 컴파일 시간이 기본모드보다 느린 점이 있지만 그만큼 최적화에 장점이 있는데 이 최적화도..
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)
·
iOS/Swift
문제에서 요구사항이 "함수 c 에 Numbers 프로토콜 요소를 가진 배열만 사용할 수 있는 함수 d 를 작성해주세요."였다. 엥? 배열 내 요소에 프로토콜 준수를 시킨다는건 대충 알겠지만 뭐 어떤 내용에 대한 준수를 하도록 할 것이며... 등등 의문이 좀 있었는데 어쨋든 구현을 해보기로 한다. import Foundationprotocol Numbers { var intValue: Int? { get }}class ThirdQuestion { func removeEvenNum(_ array: [Int]) -> [Int] { var result: [Int] = [] for i in 1...array.count { // 홀수 요소..
[TIL / 25.03.13] 의존성 주입 (Dependency Injection)
·
iOS/Swift
1. 의존성 주입, 왜 할까?개발을 하다 보면 코드 간의 의존성 문제로 인해 유지보수가 어려워지는 경우가 많습니다.객체간에 강하게 참조를 할 경우나,, 어느 객체에서 한 객체를 직접 내부에서 인스턴스화해 쓰는 경우 쓰이던 객체가 만약 문제가 생긴다면?그 문제는 그 객체만 해결해줄 게 아니라 그걸 직접 만들어 쓰고 있던 객체 측에서도 수정해줘야 합니다..!!이렇게 한 객체가 타 객체에게 의존을 하게 되어 생기는 문제를 해결할 수 있도록 의존성 주입을 해줍니다 2. 의존성 주입은 어떻게 하나? 그리고 장점은?class Guitar { func play() { print("대..충.. 기타치는 소리...") }}class Artist { var guitar = Guitar() ..