6월, 2021의 게시물 표시

[인터뷰질문 004] Codable protocol이 하는 역할이 무엇인가요?

이미지
Cadable이란? encodable과 decodable 프로토콜을 모두 채택한 프로토콜 입니다. 데이터를 손쉽게 Json이나 다른 구조화된 데이터로 인코딩 하거나, 파싱할 때 사용합니다. 예제 import Foundation struct Student : Codable { var name: String var age: Int } let studentData = """ { "name": "leeo", "age": 17 } """ .data(using: .utf8)! let student1 = try ! JSONDecoder ().decode( Student .self, from: studentData) print(student1) // Student(name: "leeo", age: 17) print(student1.name) // leeo print(student1.age) // 17 모델을 만들고, Codable 프로토콜을 채택하면 Decodable 프로토콜이 포함되어 있기 때문에 JSONDecoder().decode() 를 사용할 수 있습니다. 그러면 from: studentData 이 부분에 입력된 데이터와 Student.self 이 같은 타입인지 비교하고 일치하면 Student 의 객체로 만들어 줍니다. 사용할 때의 문제점1 swift 에서 사용하고 있는 변수는 camelCase 를 사용하고 있습니다. 하지만 내려오는 데이터도 같은 키로 내려오리란 보장이 없죠 그 때 사용할 수 있는것이 CodingKey 입니다. 같은 키는 알아서 찾지만, 다른 이름으로 내려왔을 때 수동으로 매칭해준다고 생각하시면 쉬울 것 같습니다. 코드로 예를 들어보면 아래와 같습니다. struct StudentFullname: Codable { var firstName: St...

[인터뷰질문 003] tuples이란 무엇이고 어느 상황에서 유용하게 사용할 수 있습니까?

이미지
튜플이란? 튜플은 아주 작은 익명의 'struct'라고 생각하면 편합니다. 이게 무슨의미냐 하면, struct 라는 것을 생각해보면 다양한 타입의 프로퍼티 들이 들어갈 수 있습니다. Array 는 같은 타입만 넣을 수 있지만, 튜플은 여러 타입이 들어갈 수 있는 자료형 입니다. 예제 간단하고 익숙한 예제부터 설명 해보도록 하겠습니다. let student = ( "Leeo" , 17 ) print(student .0 , student .1 ) // Leeo 17 본인은 이름이 없고, student라는 변수에 할당했습니다. 그리고 현재는 구성 요소들의 이름이 없기 때문에 index 로 접근해야합니다. 다음은 이름을 줘 보도록 하겠습니다. let student = ( name : "Leeo" ,age: 17 ) print( student .name, student.age) // Leeo 17 코드를 살펴보면 값을 이름으로 접근할 수 있습니다. 마치 struct 같지 않나요? 그리고 보이는 바와 같이 여러개의 다른 타입의 값들을 type-safe 하게 반환할 수 있습니다. 위와 같은 방법을 활용하여 1회용 이라면 struct 를 선언하지 않고 여러개의 값을 반환할 수 있습니다.

[인터뷰질문 002] Swfit에서 class와 struct의 차이점이 무엇인가요?

이미지
https://www.hackingwithswift.com/interview-questions/what-are-the-main-differences-between-classes-and-structs-in-swift 값 타입, 참조 타입 많은 분들이 머리로는 다 알고 있는 부분일것이라 생각합니다. 저도 class 는 reference type 이고, struct 는 value types이다. 라고 알고 있습니다. 그게 무슨 뜻일까요? 쉽게 비유하면, 엑셀과 스프레드 시트로 할 수 있습니다. 여러분이 하나의 엑셀을 만들고 다른 동료에게 보내고 난 다음에, 그 엑셀이 어떻게 되었는지는 관심도 없고 나에게 영향을 주지 않죠. 하지만 내가 스프레드 시트를 만들어서 전해주면, 다른사람이 내가 만든 결과물에 영향을 줄 수 있습니다. 너무 동떨어진 예제라면 아래 코드로 이해해 보도록 하겠습니다. struct Student { var na me: String var a ge: Int } 간단한 예제의 struct 가 있습니다. name 과 age 를 가지고 있습니다. let firstStudent = Student(name: "Leeo_student" , age: 17 ) print (firstStudent.name, firstStudent.age) // Leeo_student 17 var secondStudent = firstStudent secondStudent .name = "batgird_student" secondStudent .age = 18 print (firstStudent.name, firstStudent.age) // Leeo_student 17 print (secondStudent.name, secondStudent.age) // batgird_student 18 처음에 생성하고 바로 출력해보면, 생성한 결과가 나오니 이상하진 않습니다. 그리고 두번째 변수를 만...

[Swift-30-Projects] 06. IOS 클론코딩 CandySearch

이미지
테이블 뷰를 쓰다보면, 항상 검색하는 부분이 있는데 처음 이런 뷰를 보았을 때 SearchController 를 몰라서 textField 로 구현하려다가 대 망했던 기억이 있네요. 이 글을 보시는 분들 중 저와 같은 분이 계시다면 꼭 SearchController 을 좀 더 살펴보시고 구현하는걸 추천 드립니다! 앱 구조 구조는 매우 심플 합니다. 메인 테이블 뷰와 디테일 뷰 두 개로 이루어져있습니다. 메인 테이블 뷰에는 서치컨트롤러가 있어서 검색 기능이 있습니다. 네비게이션 바의 색을 칠하는 방법은 이전 프로젝트 에서 익혔기 때문에 그대로 가져다 사용했습니다. 메인 페이지에 가운데 로고를 넣고, 서치컨트롤러를 넣는데 고생을 했습니다. 결론적으로 가운데로고는 네비게이션 아이템에 뷰를 넣어서 이미지를 넣었습니다. 그리고 서치 컨트롤러는 navigationItem .searchController = searchController 이렇게 넣어주었습니다. 그리고 그 아래에 이쁜 scopeButton 은 처음 넣어 보는 것 이었는데, 아래 코드로 넣었습니다. searchController.searchBar.scopeButtonTitles = ["All", "Chocolate", "Hard", "Other"] 이 색상을 입히는 작업이 생각보다 쉽지 않았는 커스텀한 설정을 넣는 방법이 익숙하지 않아서 그랬던 것 같습니다. 좀 더 쉬운 방법이 있다면 댓글로 알려주세요! searchController .searchBar .setScopeBarButtonTitleTextAttributes ([ .foregroundColor : UIColor.candyGreen()], for :.selected) searchController .searchBar .setScopeBarButtonTitleTextAttributes ([ .foregroundColor : UIColor.white], for :....

[UXKit] 앱 탐구 생활 - App Store

이미지
개인적으로 가장 좋아하고 또 아름답다고 생각하는 앱을 리뷰해보려고 합니다. 아이폰을 쓰면서 100%의 유저들이 사용했다고 확신할 수 있는 앱 입니다. 평소에는 아무 생각 없이 쓰다가, 막상 뜯어보고 비슷하게 구현하려고 하니 생각보다 많은 기능들이 들어있음을 깨닫고 정리하면서 남겨볼까 합니다. 이 앱은 아마 기본으로 설치되어 있는 앱이라 아이폰을 사용하신다면 어렵지 않게 살펴보실 수 있을꺼에요! 런치뷰 애플이 만든 기본 앱들은 살펴볼수록 놀랍고, 또 그들이 제안하는 HIG 라는 철학위에 만들어지는 것에 놀랍다고 생각합니다. 예를 들면 런치뷰의 경우에는 사용자가 기다리는 시간을 최소화 하기위해 첫 화면과 가장 유사하게 만들어야 한다고 합니다. 보통의 다른 앱들은 광고모델이 등장하거나, 앱의 로고, 이름들이 짠 하고 나오고 첫 화면으로 넘어갑니다. 그런데 애플의 이 앱스토어는 빠르기도 하지만 켜자마자 켜진다는 느낌을 받습니다. 기다리는 시간이 체감되지 않습니다. 아래 스크린 샷을 찍는 것도 힘들 정도였습니다. 조금 더 기다리면 인디케이터가 나오기도 하지만, 첫 화면의 배경생과 같은 런치뷰를 썻기 때 문에 그 위에 무언가 나타났다는 느낌을 받았습니다. 앱 구성 크게 5개의 탭바로 되어있습니다. 투데이 게임 앱 Arcade 검색 굉장히 직관적이지만, 실제 앱의 카테고리로 나누고 탭을 줄여도 되지 않았을까 라는 생각도 듭니다. 반대로 생각해보면, 앱을 소개하고 싶고, 큰 가지를 탭바로 나누어 놓은 것 처럼 생겼습니다. 트렌트에 맞는 투데이, 게임, 앱, 아케이드 앱 언제든지 애플의 운영정책에 따라 탭바의 아이콘과 내용이 바뀌어도 이상하지 않아 보입니다. 투데이 홈 화면에서는 예쁜 카드들이 특정 기준에 해당하는 앱을 설명해줍니다. 인기있는 앱이나 흥미로운 아티클과 함께 앱소개가 되어 항상 보면서 이런 앱들이 새로 나왔구나 라는 정보를 얻고 있습니다. 그 와중에 이상한 곳에서 감동을 받았는데 바로 카드클릭 애니메이션 이었습니다. 투에이에 ...

[인터뷰질문 001] Swfit에서 dictionary와 array의 차이점이 무엇인가요?

이미지
데이터 접근 방식의 차이 array는 정렬된 값들의 모임이고, dictionary는 정렬되지 않은 key-value 쌍의 값들의 모임입니다. 그러므로 데이터에 접근하는 방법이 다릅니다. array - 숫자로 된 index에 데이터에 접근합니다. // print (myArray[ 3 ]) dictionary - 사용자가 정의 한 key 값을 통해 value에 접근합니다. // print (myDictionary[ "apple" ]) 데이터 정렬의 차이 array는 index의 순서대로 정렬이 되어있습니다. 그래서 반복문으로 출력을 하게 되면 일정한 순서가 있고, 순서대로 출력되게 됩니다. let fruits = [ "banana" , "apple" , "avocado" ] for item in fruits { print (item) } // banana // apple // avocado 물론 정렬을 지원하기도 합니다. let sortedFruits = fruits.sorted {$0 < $1} for item in sortedFruits { print (item) } // apple // avocado // banana dictionary는 기본적으로 정렬되어있지 않습니다. 이게 무슨뜻 인지 아래 코드로 설명하겠습니다. let fruits = [ "banana" : " $3 " , "apple" : " $8 " , "avocado" : " $12 " ] for item in fruits { print (item.key, item.value) } // avocado $12 // banana $3 // apple $8 출력된 결과를 보면, 알파벳 순도 아니고, 그 어떤 기준도 없습니다. 정의 그대로 정렬되어 있지 않...