IOS

    UIKit 스토리 보드 없이 프로젝트 시작하기

    xcode로 프로젝트를 시작할 때 기본적으로 스토리 보드를 통해 UI 작업이 시작 되는데요. UI적인 요소인 스토리 보드 없이 소스코드로만 작업 하는 방법을 알아 보겠습니다. Main.storyboard 삭제 기본적으로 생성되는 Main.storyboard를 삭제 해요. move to trash를 통해 파일을 확실히! 날려버립니다. info.plist 에서 Storyboard Name 프로퍼티 삭제 info.plist로 들어간 후, Storyboard Name을 검색해서 - 버튼을 통해 삭제를 해요. Build Settings에서 스토리보드 file base Name 삭제 좌측 프로젝트 네비게이터에서 루트인 프로젝트를 클릭해요. 그다음 Build Settings 를 들어가면 해당 값을 확인할 수 있어요...

    Swift Combine 알아 보기

    틀린 부분이나 다른 의견은 언제든 댓글로 지적해 주세요!!! ios 투두 앱을 개발하는 중에 한가지 고민이 생겼다. 내 투두 앱은 달력탭과, 투두 리스트 탭이 있는데, 달력 탭에서도 그 날의 투두 리스트 목록을 하단에 작게 표기해준다. 투두 리스트 탭에서 투두를 완료하거나 삭제할 때, 달력 탭에서도 즉각 적용이 되어야 할텐데.. 그걸 어떻게 알릴까!? 라는 고민이 들었다. 옵저버 패턴처럼.. notify, update 할 수 있는 기능이 Swift 에 있지 않을까..? 하고 찾아보니 Combine이라는 것을 발견 했다! Combine이란? combine은 애플에서 정식으로 지원하는 프레임워크로, 비동기적으로 이벤트 핸들링을 지원하는 프레임워크라고 한다. 이전에 외부 라이브러리인 RxSwift의 애플 버전..

    iOS fcm을 이용한 remote push 알림

    기본적인 애플 remote notification 및 구글 fcm설정에 대한 내용은 다루지 않는다. NotificationCenter NotificationCenter는 이벤트 브로커 같은 역할을 한다. 이벤트를 수신하여 옵저버들에게 발송한다.NotificationCenter.default.post 디폴트 NotificationCenter로 메세지를 보낸다. Notification 구조체를 파라미터로 받는다. 또는 name: NotificationName, object: Any?, userInfo: [AnyHashable: Any?] 를 받는다. 이 파라미터들은 Notification 필드들과 동일하다. NotificationCenter.default.addObserver name: 수신할 notific..

    SwiftUI onDelete 수정자 사용

    List 아이템 드래그해서 삭제 처리 List { ForEach(listItems, id: \.id) { item in Text(item.name) } .onDelete(perform: removeItems) } SwiftUI 의 List 아이템에 제거로직을 추가 하려면 ForEach에 onDelete 수정자를 추가하면 된다. onDelete에 perform파라미터로 받는 메소드는 IndexSet을 메소드로 넘겨준다. IndexSet 이용하여 리스트 핸들링 func removeItems(at offsets: IndexSet) { let removedItems = offsets.map {listItems[$0]} for item in removedItems { api.deleteItem(item.id) }..

    SwiftUI ViewBuilder란

    애플 문서를 보면 "뷰를 클로저로 구성할때 붙히는 커스텀 파라미터 애트리뷰트" 라고 정의 되어 있다. 전혀 이해가 가질 않는다.. view() 함수는 some View 로 opaque Type을 리턴한다. opaque type이므로 함수 내부에서 어떤 타입을 리턴하는지 결정 해야 하는데, Text와 VStack 은 공통타입이 아니다. AnyView 로 감싸 모든 케이스에 대해 AnyView를 리턴하도록 하면 오류는 사라진다. 더 좋은 방법은 ViewBuilder를 사용하는 것이다. ViewBuilder는 return statement 를 갖지 않는다.

    Swift GCD

    GCD: Grand Central Dispatch 멀티코어 시스템에서 concurrent 실행을 제공하는 프로그래밍 언어 요소 DispatchQueue 는 Swift 의 GCD 중 하나이다. Serial, Concurrent Serial 큐에 추가된 순서대로 한번에 하나의 task를 실행한다. DispatchQueue("myLabel") Concurrent 운영체제는 DispatchQueue에서 꺼낸 현재 작업이 끝나지 않더라도, 다음 작업을 다른 스레드에 할당시켜 실행한다. DispatchQueue(label: "", attributes: .concurrent) DispatchQueue (Main, Global, Custom) Main dispatch Queue(DispatchQueue.main) 앱의..

    ObservableObject 와 Codable 같이 사용하기

    ObservableObject 와 Codable을 같이 채택하면 오류가 발생 한다. Type 'TodoItem' does not conform to protocol 'Decodable' Type 'TodoItem' does not conform to protocol 'Encodable' @Published 프로퍼티 래퍼를 사용하면 Published 로 래핑되는데, 해당 래퍼는 Codable을 채택하고 있지 않다. 따라서 Codable을 채택하도록 extension을 적용한다. //PublishedWrapper라는 클래스를 선언 후, Published형 타입을 받아 @Published에 저장한다. private class PublishedWrapper { @Published private(set) var ..

    Swift enum

    원시값이 없는 enum enum BodyPart { case head case arm case leg //또는 case head, arm, leg } let bady: BadyPart = .head 원시 값(Raw Value) 이 있는 열거형 Int 를 원시 값으로 갖는 열거형 enum BodyPart: Int { case head, arm, leg } 각각 순서대로 0, 1, 2 가 rawValue에 할당 되어진다. enum BodyPart: Int { case head = 10, arm, leg = 30 } enum BodyPart: String { case head = "head!", arm, leg="leg!" } Int형 열거형의 경우는 값을 지정하지 않은 값은 이전 열거형 + 1 값이 rawV..

    Swift 에러 핸들링 (try, catch, throw, throws, do)

    Error 선언 enum TestError : Error { case outOfRange case invalidInput(testNum : Int) } 에러를 선언시 Error 프로토콜을 구현하도록 한다. Error를 발생 시킬 메소드 선언 func method(param: Int) throws -> Int { guard param > 0 else { throw TestError.outOfRange } } 에러를 던질 가능성이 있는 메소드에 throws 선언 에러 발생 시 throw로 에러를 던진다. 에러 발생 가능성이 있는 메소드(throws 선언 되어 있는 메소드) 는 실행시 try 구문이 필요하다. try 구문 사용 호출 do { let result = try method(param: -1) } c..

    UIKit 커스텀 애니메이션

    transitioningDelegate 모든 뷰 컨트롤러가 가질 수 있으며, UIViewControllerTransitioningDelegate 프로토콜을 따른다. func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? 위 메소드를 구현하여 애니메이션 컨트롤러를 리턴하게 한다. UIViewControllerAnimatedTransitioning 애니메이션 컨트롤러 라 칭한다. TransitioningDelegate 가 리턴하는 애니메이션 컨트롤러 객체 transitio..