HTTP 프로토콜을 이용해 서버와 통신하는 경우, 클라이언트쪽에서는 서버에서 받은 데이터를 가공해서 사용해야 한다.이 과정을 디코딩이라고 하는데, 보통 Swift에서 데이터를 받는 그릇으로 struct로 만드는 편이다.그러니까, 서버에서 String형태로 오는 데이터를 struct에 담아 가공해서 데이터를 사용하는 방식이라고 생각하면 된다. 그러다보니 이런 궁금증이 생겼다."왜 class가 아닌 struct로 받는거지?" 이번 글에서는 iOS의 네트워크통신과, struct/class의 차이점을 알아보겠다.iOS의 네트워크통신클라이언트가 서버에게 "이런 데이터 가져다줘!"라고하고, 서버가 해당 데이터를 응답으로 주는걸 보통 "네트워크 통신을 한다"고한다.이러한 정보 요청에 대한 기준을 API라고 하며, 그..
Swift로 개발을 하다보면 Any라는 타입을 만나게 된다.예를 들어 어떤 배열의 타입이 Any라면 그 타입에는 어떤 타입이든 들어올 수 있다는걸 뜻한다. 이 글에서는 Any타입의 특징과, 이와 비슷해보이는 AnyObject에대해 알아보도록 하겠다.Any타입의 특징Any타입을 담을 수 있는 배열에는 모든 타입이 들어올 수 있다.var somethings: [Any] = []somethings.append(true)somethings.append(iPhone) // 직접 만든 클래스의 인스턴스somethings.append("something")개발자문서에 따르면 Any타입에 포함될 수 있는 타입은우리가 알고있는 Int, String, Bool타입 등 기본 타입 뿐 아니라 튜플, 클로저 또는 함수타입까지 ..
TableView나 CollectionView에서 CustomCell을 XIB로 생성하게 되면 awakeFromNib()이라는 메서드가 생기게 된다.쉽게 이 함수의 역할을 설명하자면 ViewController에서 viewDidLoad의 역할과 비슷하다고 생각하면 된다. cell의 디자인을 해당 함수에 적용시켜놓으면 cell이 로드될때 보이게 된다. 이번 글에서는 awakeFromNib이 호출되는 시점과 prepareForReuse이 필요한 이유에 대해 알아보도록 하겠다. awakeFromNib의 호출시점원래 셀의 디자인과 데이터에 관련된 코드를 ViewContoller의 `tableView(_ tableView: , cellForRowAt indexPath: )`메서드에서 호출해서 사용했었다. 그러나, ..
FullScreenModal 등으로 화면이 꽉 찬 상태에서 이전 뷰로 돌아가고 싶을 때 다양한 방법이 있을 수 있다.만약 present로 모달이 올라오게 코드로 작성한 상황에서는 dismiss기능으로 모달을 닫을 수도 있다.반면 unwind segue라는 특이한 기능도 있는데, 이는 보통 스토리보드로 개발할때 주로 사용하며, 특정한 화면으로 돌아가고 싶을 때 사용 하는 기술이다.unwind segue를 왜 사용하나요?공식문서를 참고해보면, 뷰컨트롤러를 dismiss할때 사용하는 기능인 unwind segue는 런타임에 해당 세그웨이의 대상을 결정하므로 뷰 컨트롤러 계층을 설정하는 방법에 제한이 없다.예를 들어 다음과 같이 두 개의 VC가 동일한 자식 VC를 표시하는 상황이 있을 때, 다음에 표시할 VC를..
iOS 앱에서 데이터를 로컬에 저장하는 방법은 다양하다.오늘은 그중에서 UserDefaults에 대해서 알아보고, 간단한 사용방법과 함께 구조체를 UserDefaults에 저장하는 방법까지 알아보겠다.UserDefaults란?앱을 사용할 때 서버를 사용하지 않는 이상 데이터를 로컬 즉, iOS 디바이스에 저장해야 한다. 데이터를 로컬에 저장하는 방식에는 UserDefaults, CoreData, SwiftData 등 다양한 방법이 있다.그 중 UserDefaults는 런타임에 메모리에 데이터를 저장하기 때문에 사용자의 기본 설정(닉네임) 등의 단일 데이터 값을 저장하기에 적합하다. 반면 CoreData등은 관계형 데이터베이스를 이용해 대량의 데이터를 저장하기에 적합하다.예를 들어 일기앱의 경우 사용자가 ..