IOS

    [Swift] ObservableObject이용해 옵저버(Observer) 패턴 구현하기

    [Swift] ObservableObject이용해 옵저버(Observer) 패턴 구현하기

    옵저버 패턴이란? 옵저버 패턴이란 데이터 스트림과 데이터 스트림을 구독하는 구독자로 이루어진 패턴이다. 데이터 스트림은 자신이 가지고 있는 객체가 변화시 변화된 값을 발행하며, 구독자는 이 값을 구독하여 발행된 값을 이용해 특정한 작업을 수행한다. 데이터 스트림은 '발행자'라고 불리기도 해 '발행자 구독자 패턴'이라고 부르기도 한다. ObservableObject란? ObservableObject는 값을 발행하는 객체를 제공하는 Combine Framework의 타입이다. *Combine Framwork는 Swift에서 쓸 수 있는 여러 event-processing operator을 제공해 비동기 작업을 도와주는 프레임웍이다. ObservableObject의 위 특성은 옵저버 패턴을 구현하기 위해 사용..

    [SwiftUI] SwiftUI에서 Custom View 만들기 : State와 body를 사용하는 방법

    [SwiftUI] SwiftUI에서 Custom View 만들기 : State와 body를 사용하는 방법

    SwiftUI에서 Custom View 만들기 Custom View는 재활용 가능한 View의 단위이다. SwiftUI에서는 간편하게 Custom View를 만들 수 있는 방법을 제공한다. 아래에서 구성요소부터, 만들고 사용하는 방법까지 살펴보자. Custom View의 구성요소 SwiftUI에서 재활용 가능한 CustomView를 만들기 위해서는 View 타입의 struct와 State와 Body 두가지가 필요하다. State : CustomView의 UI State를 저장하는 변수. 이 값이 바뀔 때 Custom View가 업데이트 된다. State가 선언되지 않은 변수는 변경이 불가능하다. Body : CustomView의 UI를 그려주는 부분. 타입은 항상 some View 여야 하며, 이 부분에..

    [Swift] ViewController의 lifecycle methods 알아보기

    ViewController의 lifecycle methods viewController은 화면에 보여지기 전부터 화면에서 사라질 때까지 다음 5단계의 lifecycle 메서드들을 수행한다. viewDidLoad ↓ viewWillAppear ↓ viewDidAppear ↓ viewWillDisappear ↓ viewDidDisappear 각 단계에 맞는 작업을 수행하는 것이 매우 중요하다. 아래에서 각 메서드가 언제 불리는지 알아보도록 하자. viewDidLoad view가 로드됐을 때 한 번만 불린다. 이 단계에서는 view를 초기화 하는 작업을 한다. viewWillAppear view가 사용자에게 보여지기 전에 불린다. UI 컴포넌트의 visibility를 조절하거나 할 때 유용하다. 이 메서드는 ..

    [Swift] TableView 이용해 화면에 목록 표시하기

    [Swift] TableView 이용해 화면에 목록 표시하기

    TableView란? TableView는 화면에 목록을 표시하기 위한 UI구성요소이다. TableView의 구성요소 TableView는 TableView와 TableViewCell 두가지로 이루어진다. TableView: TableViewCell을 여러개 담기 위한 컨테이너 TableViewCell: 하나의 아이템 TableView 만들기 1. TableView는 TableView에 TableViewCell을 넣는 형태로 만들어진다. 따라서 TableViewCell을 만들 수 있도록 다음과 같이 구조를 만들도록 하자. 이 때 TableViewCell의 Identifier은 ResuableCell이 된다. 2. 우리는 UITableView의 각 아이템을 만들기 위해 UITableViewDataSource ..

    [Xcode] Package Manger 사용해 라이브러리 추가하기

    [Xcode] Package Manger 사용해 라이브러리 추가하기

    Package Manager란? Package Manager란 iOS에서 라이브러리(패키지)를 추가하기 위해 Xcode에서 제공하는 Tool이다. Package Manager 이용해 패키지 추가하기 1. File-Add Packages를 클릭한다. 2. 추가하고 싶은 Package를 github이나 package 제공자에서 찾아 추가한다. 이 글에서는 firebase sdk를 추가하였다. 3. 버전을 선택한다. 보통 구체적인 버전 명을 명시할 수 있는 Exact Version을 사용한다. 4. 설정이 다 끝났으면 Add Package를 누른다. 5. 로딩이 끝날 때까지 기다린다. 6. 하나의 경로에서 여러 라이브러리를 제공하는 경우 다음과 같이 원하는 라이브러리를 선택하라는 창이 뜬다. 여기서 원하는 라..

    [iOS Build] CocoaPods Homebrew이용해 간단히 설치하기

    [iOS Build] CocoaPods Homebrew이용해 간단히 설치하기

    CocoaPods 설치하기 CocoaPods를 설치하려고 이 문서 저 문서를 뒤지면서 설치를 진행했는데 오류가 생겨서 해결 방법을 찾아 글을 쓰게 되었다. 인터넷 상에는 gem을 사용해 install하는 방법만 있는데, 이 방법으로 install하면 잘못 설치되어 pod install 명령어를 실행 시 오류가 발생한다. 이에 따라 HomeBrew를 이용해 한 번에 설치하는 방법에 대해 살펴보고자한다. Homebrew 설치하기 Homebrew는 터미널에서 다음 명령어를 실행해 설치할 수 있다. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 다음 페이지를 참조하길 바란다. https:..

    [Swift] 위치 권한 요청 방법 및 요청 문구 변경 방법 알아보기

    [Swift] 위치 권한 요청 방법 및 요청 문구 변경 방법 알아보기

    위치 권한 요청 방법 iOS 의 위치 권한 요청은 다음의 3단계로 이루어진다. CoreLocation 모듈 추가 CLLocationManager 초기화 CLLocationManager에서 location 권한 요청 import CoreLocation // 1. CoreLocation Module Import class [클래스명]: UIViewController { let locationManager = CLLocationManager() // 2. CLLocationManager 초기화 override func viewDidLoad() { super.viewDidLoad() locationManager.requestWhenInUseAuthorization() // 3. Location 요청 } 위치 권..

    [Swift] extension 키워드 이용해 타입 기능 확장하기

    클래스 기반 모델의 문제점 클래스 기반 모델은 보통 protocol(interface)를 확장하는 방식으로 함수를 만들어낸다. 하지만, 문제는 하나의 클래스는 하나의 protocol만을 확장하지 않는 경우가 많다는 것이다. 특히 iOS의 ViewController의 경우는 여러 기능이 들어가야 하기 때문에 여러 protocol을 상속받는다. 하지만 여러 프로토콜을 상속받게되면 하나의 클래스에 여러 함수를 구현해야 되기 때문에 클래스가 복잡해진다. 예를 들어 사람 클래스에 커피샵 직원 프로토콜과 Programming을 위한 프로토콜을 상속한다고 해보자. 그러면 다음과 같이 Person class가 매우 커진다. class Person : CoffeeShopEmployee, Programming{ func ..

    [Swift] Background Thread에서 Task 실행하기

    Background Thread에서 Task 실행이 필요한 이유 예를 들어 우리가 서버에 특정한 데이터를 보내줄 것을 요청을 했다고 해보자. 그러면 다음과 같이 URLSession을 만들고 URLSession의 dataTask를 이용해 데이터를 받아온다음 메서드를 수행해야 한다. func performURLRequest(with urlString: String) { if let url = URL(string: urlString) { let session = URLSession(configuration: .default) let task = session.dataTask(with: url) { (data, response, error) in //get responseData self.dosomeThing(..

    [Swift] internal parameter name과 external parameter name

    Swift func의 parameter Swift func는 external parameter name과 internal parameter name이라는 신기한 기능이 있다. 이것은 외부에서 받을 파라미터 이름과 내부에서 사용할 파라미터의 이름을 구분하기 위해 만들어진 것인데 다음과 같은 구조로 되어 있다. 이루어진다. func [func name]([external] [internal]: Int) -> Int { } 예를 들어 더하기를 위한 func을 만든다고 해보자. 이때 외부에서 받을 파라미터 이름을 n1과 n2로 하고 내부에서 사용할 이름을 number1과 number2로 한다면 func이 다음과 같이 만들어질 수 있다. func add(n1 number1: Int,n2 number2: Int) ..