⭐️ 개발

    [iOS] 다국어 지원 i18n, l10n

    [iOS] 다국어 지원 i18n, l10n

    i18n 국제화 / l10n 현지화 국제화는 문화에 가깝고(시간대, 화폐 단위, right to left 등의 차이), 현지화/지역화는 언어에 가까움 방법 : plist, string file, 스토리보드 등으로 대응이 가능한데, 보통 string으로 대응하는 방식이 자주 쓰임 1. 스보기반 프로젝트 - info - localization Base : 보통 영어로 대응 스토리보드에 있는 정적인 라벨 등의 내용도 바꾼다. 어떤 언어를 기본으로 보여줄 건지 결정할 수 있다. 예를 들어, 이탈리아에서 영어를 기본으로 등.. 추가하면 스보에 여러개의 파일이 생긴다. ObjectId를 기반으로 대응해줄 수 있다. 단점은, 스보에서 버튼을 하나 더 추가하면 ObjectId가 생성이 되지만, 기존 등록된 객체들만 다..

    [GCD] Swift Concurrency - GCD

    [GCD] Swift Concurrency - GCD

    Swift Concurrency 1. GCD 2. OperationQueue : 내부적으로 GCD 기반으로 이루어져 있음 3. Async/Await : iOS15~ 나온 새로운 기술 비동기를 위한 아이덜~ serial/Main + Sync serial/Main + Async concurrency/Global + Sync concurrency/Global + Async Global Quality of Service - QoS DispatchGroup - 동기 DispatchGroup - 비동기 경쟁상태 요약 코드 참고 : https://github.com/heerucan/iOS-Begin-Again/commit/9a9e19fd71746fb2c1f49c8441dd4a9f72cb6791 🚫 1. Serial/..

    [iOS] 안간단한 MVVM 안간단하게 톺아보기

    [iOS] 안간단한 MVVM 안간단하게 톺아보기

    어려운 MVVM MVC MVC단점 MVVM 코드에 적용하기 MVC 패턴 🔆 model : data schema, server data model, 일반 데이터 모델 - 화면과 상관없는 데이터를 다루는 영역 🔆 view : label, button 등 🔆 controller: model이 가지고 있는 정보를 controller에서 다룸, 인스턴스 변수를 만들어서 데이터 활용 1. controller는 model한테 데이터를 달라고 말할 수 있음 = controller는 model에 항상 접근할 수 있다. - controller에서 인스턴스를 통해서 model에 접근하는 과정을 볼 수 있움 2. view는 자기가 어떤 컨트롤러에 속해있는지 모른다. - 어디에 속해있는지 알려주기 위해 outlet과 인스턴스를..

    [iOS] URLSession(1)

    [iOS] URLSession(1)

    URLSession 요청을 하는 하나하나가 Task라고 해서 URLSessionTask CompletionHandler를 통해서 클로저 구문에서 네트워크 통신이 일어나게 됨 [1] URLSession 일반적으로는 shared를 가장 많이 쓰는데 default 값이라 응답은 클로저로 받고, 커스텀이 불가능해서 백그라운드 다운로드가 불가하다. 만약 커스텀을 하고 싶다면, 초기화 구문의 configuration을 통해서 가능하다. 1). 기본값은 default인데 URLSession.shared과 설정이 유사하지만 - 커스텀이 가능하고(셀룰러 연결 여부를 캐치해서 사용자한테 "너 LTE 쓸 건데 괜찮아?"라고 물어볼 수 있음, - timeout 간격(ex. 서버에게 요청하고 5초가 지났는데 응답이 오지 않으면..

    [GCD] Dispatch Group

    [GCD] Dispatch Group

    Dispatch Group 작업들의 모음, 그룹지어진 작업들이 어느 시점에 모두 완료되는 지가 관심사 1). 동기적인 함수 작업들이 완료될 때 2). 비동기적인 함수 작업들이 완료될 때 (주의!!) 서로 같은 색끼리 유사한 작업인데, 보라색/하늘색/빨간색 작업이 끝나는 시점을 아는 것이 DispatchGroup 작업을 그룹 짓고, 각 그룹별로 끝나는 시점을 알고 싶다!!!!! 특정 그룹의 모든 작업이 완료된 시점을 활용해서 무언가를 하고 싶다 이거임. 왜 이 개념이 필요할까? 예를 들면, 여러 애니메이션 효과가 겹쳐 있을때, 애니메이션이 모두 종료된 시점을 알고 싶다. 런치스크린 후에 앱 첫 화면에 브랜드 이미지가 다운로드가 덜 되어 있는 상황이라면 사용자가 에러라고 인식할 수도 있을 것임 첫 화면을 띄..

    [Swift] Codable

    [Swift] Codable

    SWIFT4가 나오면서 Codable 프로토콜이 새로 나옴 swiftyJSON은 가볍게 사용하기는 좋지만 많은 데이터를 처리하기에는 시간이 오래 걸린다. JSONSerialization이 가장 빠르게 처리되기는 하지만 코드가 복잡해서 JSONDecoder를 많이 선택한다. 우리가 오픈소스로 데이터를 처리했다면 이제는 JSONDecoder 라는 스위프트에서 제공해주는 클래스로 처리를 해보자! 🔆 Typealias를 통해서 Encoding, Decoding을 합친 것이 Codable Encoding : [struct -> JSON] struct/class를 서버에게 보내기 위해 외부 데이터로 변경 Decoding : [JSON -> struct] 서버에서 받은 외부 데이터를 우리가 사용할 수 있게 struc..

    [Swift] Error Handling

    [Swift] Error Handling

    스위프트 에러, 핸들링, 안일어나면 좋겠지만, 난 에러를 오늘도 만났골랑, 잣같다. https://jusung.gitbook.io/the-swift-language-guide/language-guide/17-error-handling 에러 처리(Error Handling) - The Swift Language Guide (한국어) 프로그램 실행시 에러가 발생하면 그 상황에 대해 적절한 처리가 필요합니다. 이 과정을 에러 처리라고 부릅니다. Swift에서는 런타임에 에러가 발생한 경우 그것의 처리를 위해 에러의 발생(throw jusung.gitbook.io Swift에서는 Error 프로토콜을 채택하는 방식으로 표현을 한다. 정확한 타입은 따로 존재하지 않는다. 근데 이 Error 프로토콜 내에는 아무 ..

    [Swift] WMO - Swift 성능 최적화

    [Swift] WMO - Swift 성능 최적화

    https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#protocols GitHub - apple/swift: The Swift Programming Language The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub. github.com 고성능 Swift 코드는 Swift 프로그램의 품질을 개선하고 코드를 오류가 덜 발생하고 읽기 쉽게 만드는 데 도움을 준다고 한다. 한마디로 컴파일 시에 성능을 향상시키기 위해 코드 작성 시에 개발자가 해줄 수 있는 부분에 대해 애플이 문서로 작성해 알려주고 있는 거다. S..

    [Swift] Realm 진짜.그냥.간단.정리

    Realm 진짜.그냥.간단.정리 realm 파일에 접근하기 let localRealm = try! Realm() 데이터 저장하기 let task = UserDiary(~) try! = localRealm.write { localReam.add(task) } 데이터 가져오기 realm에서 읽어온 데이터를 담을 배열을 선언하는데 그 이유는 realm의 데이터 중 원하는 내용을 가져와서 보관할 공간으로 사용할 것이기 때문이다, 동시에 realm의 테이블을 직접 수정하지 않고, 데이터만 가져와서 화면에 사용하기 위함이다. var tasks: Results! 데이터 정렬하기 이렇게 가져온 데이터의 순서는 마구잡이라, 특정 컬럼을 기준으로 정렬을 해주면 좋을 것이다. tasks = localRealm.objects..

    [iOS] Realm 기본 설계 + Realm에 저장하고 가져오기

    [iOS] Realm 기본 설계 + Realm에 저장하고 가져오기

    Database https://www.mongodb.com/docs/realm/sdk/swift/quick-start/ 데이터베이스 : 데이터를 저장한 파일들의 집합체 - DBMS : DataBase Management System : 데이터베이스를 관리하기 위한 소프트웨어, 엑셀도 마찬가지임 - RDBMS : 관계형 데이터 베이스 : relational Database management system 데이터를 표 안에 정리하는 것, 테이블 구조 RDBMS 테이블과 테이블 간 외래키를 통해 정보 구현 중복 데이터 저장 방지 데이터베이스 내의 테이블을 Schema 각각의 데이터 모델을 스키마 name, title, date를 이름지어서 정리하는데 이걸 Column = Attribute 저장되어 있는 하나의..

    [iOS] loadView()

    [iOS] loadView()

    loadView() 뷰디드로드 보다 전에 호출이 되는 친구 기본값이 nil이다. 따라서, loadView를 사용 시에 super 메서드를 사용하면 기본값이 nil이기 때문에 사용하면 안된다. - 스보 상에서는 내부적으로 자동으로 loadView를 호출하고 스보의 루트뷰를 가져와서 넣는 것으로 동작한다. - 코드로 작성 시에는 뷰컨에서 loadView()를 호출해서 rootView를 등록해줌으로써 채워준다. (새로운 rootView를 껴넣고 싶을 시에!!!) 근데 새로운 rootView를 채워주고 싶을 수도 있다. viewDidLoad는 rootView까지 메모리에 올라가고 난 후의 상황이다. (이미 rootView가 만들어진 상태) 근데 우리가 만든 BaseView는 아래 사진처럼 이 정도까지 만들어둔 ..

    [Swift] Generic

    [Swift] Generic

    Generic - 타입에 유연하게 대응하기 위한 요소이다. - Type Parameter: 플레이스 홀더 같은 역할, 어떤 타입인지 타입의 종류는 알려주지 않음, 특정한 타입 하나라는 건 알 수 있음 - 한 가지 종류가 들어가는데 어떤 타입이 들어갈 지는 모른다. - 제네릭으로 이루어진 함수 사용 시 T에 들어갈 타입은 모두 같아야 한다. - UpperCased ex. - Type Constraints : 클래스/프로토콜 제약을 걸어줘야 한다. struct DummyData { var name: T } let data = DummyData(name: "abc") let intData = DummyData(name: 3) let boolData = DummyData(name: true) 관련 오류 Gene..

    [Refactor] Weather 플젝에서 연산 프로퍼티로 모델/컨트롤러 분리하기

    [Refactor] Weather 플젝에서 연산 프로퍼티로 모델/컨트롤러 분리하기

    struct Weather { let icon, description: String let wind: Double let humidity, temp, tempMax, tempMin: Int var tempLabel: String { return "현재 온도는 \(temp)°" } var maxMinLabel: String { return "최고 \(tempMax)° 최저 \(tempMin)°" } var humidityLabel: String { return "현재 습도는 \(humidity)% 입니다." } var windLabel: String { return "현재 풍속은 \(wind)m/s 입니다." } var descriptionLabel: String { return description.co..

    [GCD] weak self

    [GCD] weak self

    ARC, 클로저의 캡처 리스트 ARC Automatic reference Counting heap(클래스) 메모리에 할당되는 메모리 관리를 위해 나를 가리키는 녀석이 몇 개이냐! 0개이면 heap 메모리에서 사라지게 하는 것이 ARC 모델의 핵심 - 클래스의 인스턴스 weak, unowned로 선언 시에 reference counting이 일어나지 않도록 방지 - 클로저 클로저의 캡처리스트 내에서 weak, unowned를 선언해서 RC가 올라가지 않도록 함 우선 먼저 weak self를 붙여주지 않은 경우다. 이 경우에는 강한 참조가 일어날 것이다. class ViewController: UIViewController { var name: String = "뷰컨" func doSomething() { ..

    [iOS] UIView의 초기화 구문 다시 알자!

    [iOS] UIView의 초기화 구문 다시 알자!

    매번 UIView를 상속해서 커스텀 뷰를 만들면 해당 에러코드가 떴던 기억이 있을 것이다. 난 저 초기화 구문을 사용하지 않는 것인데도, 매번 떠서 빡친 기억... 잇을 것임. 분명... 이것이 왜 떳는지! 코드를 통해서 알아보자면, example이라는 프로토콜 내에 초기화구문이 있고, Mobile 클래스가 해당 프로토콜을 채택하고 있다. 그 경우에 에러 메시지가 말하길! required를 작성해주라고 말하고 있다. 즉, required라는 키워드는 프로토콜에 있는 초기화 구문이기 때문에 붙는 것이다. 그래서 아까 그 매번 뜨던 에러메시지는.... 프로토콜 초기화 구문이기에 호출되는 것이다. 왜냐하면 프로토콜 내 프로퍼티나 메소드는 optional이 아니면 항상 불리기 때문이다. 아 ~ 초기화 구문이 프..