[인터뷰질문 007] Array를 사용할 때, map()과 compactMap()를 쓰는 차이점은 무엇인가요?

이미지
map vs compactMap 기본적으로 정의를 알아야 하는 내용이기 때문에, map 와 compactMap 의 내용을 보고 기능을 아는 것이 중요할 것 같습니다. 짧게 요약하면, map은 내가 가진 데이터들을 다른 형태나 다른 값으로 변환 해주는 녀석 입니다. compactMap은 내가 가진 데이터들 중에 nil 값을 제거해 주는 녀석이죠. 용도에 맞게 쓰면 되겠습니다 아래 예제 코드를 간단히 비교해서 언제 써야 할 지 고민해보아요. map let numberList = [ 1 , 3 , 4 , 5 , 7 ] print(numberList) // [1, 3, 4, 5, 7] let doubleNumberList = numberList.map { $ 0 * 2 } print(doubleNumberList) // [2, 6, 8, 10, 14] 정말 간단한 예제입니다. 내가 가진 데이터가 있는데, 모두 2배를 해야한다면 반복문인 for 로 모두 순회 하면서 2배씩 곱하고 그 값을 새로운 배열에 저장하는 방법이 가장 먼저 떠오르지만 위의 예제를 사용하면 우아하게 데이터를 변형할 수 있습니다. compactMap let numberListWithNil: [ Int ?] = [ 1 , 2 , 4 , nil, 1 , 3 ] print (numberListWithNil) // [ Optional ( 1 ), Optional ( 2 ), Optional ( 4 ), nil, Optional ( 1 ), Optional ( 3 )] let doubleNumberListWithNil: [ Int ] = numberListWithNil.compactMap { $ 0 } print (doubleNumberListWithNil) // [ 1 , 2 , 4 , 1 , 3 ] 마찬 가지로 가지고 있는 Array에 값이 항상 있다는 보장이 되지 않는 Optional 이라면, compactMap을 사용해서 Optional값을 없앤 새로운 데이터를 만들 수 있습니

[인터뷰질문 006] Float과 Double 그리고 CGFloat의 데이터 타입 차이는 무엇인가요?

이미지
처음 숫자를 다룰 때는, Int 형을 썼습니다. 그러다가 이제 나눗셈이 들어가면서 부터 실수를 사용해야 하는데, 그 때 마다 대충 적당히 쓰다가 정확한 차이점과 그 쓰임새를 정리하려고 합니다. Float vs Double 변수의 크기가 다릅니다. Int와의 다른점은 생략하겠습니다. 자세 한 부분은 부동소수점 을 참고하면 좋습니다. Float은 32-bit, Double은 64-bit 입니다. 즉 Float은 2의 24승인 16777216.0, Double은 2의 53승인 9007199254740992까지 표현할 수 있습니다. 물론 정확한 범위는 소수점까지 포함되어야 하겠지만 Float과 Double의 크기 차이가 어느 정도 인지만 나타내겠습니다. 아래 코드는 궁금해서 출력해 본 코드 입니다. 궁금하신 분들은 한 번 복, 붙 해서 돌려보세요 :) import Foundation var float : Float = 16777216 var double : Double = 9007199254740992 print ( float ) float = float + 1 print ( float ) print ( double ) double = double + 1 print ( double ) var total: Double = 1 for i in 1. .< 55 { total = total * 2 print (i, total) } Float vs CGFloat CGFloat은 import UIKit 해야 쓸 수 있다는 점이 다릅니다. 돌아가는 기기에 따라 32-bit 이나 64-bit이 될 수 있으나, 현실적으로는 거의 64-bit입니다. 추가적으로 Swift 5.5 버젼 이상에서는 CGFloat 과 Double 이 교환 가능하다고 합니다.

[인터뷰질문 005] Array와 Set의 차이가 무엇인가요?

이미지
Array와 Set의 차이점 Array, 한국어로 하면 배열입니다. 의미 그대로 무엇인가를 나열할 수 있는 배열이기 때문에 다양한 타입이 오기도 하고 중복되는 같은 값이 와도 이상하지 않습니다. Set, 한국어로 하면 집합입니다. 이런 저런것들이 나열되어 있다기 보다는 중복되지 않은 값들을 그룹으로 모아놓은 느낌이 강합니다. 정리 해 보면, 여러개의 값들을 나열할 수 있는 것은 Array , 중복을 제거한 집합은 Set 입니다. 그리고 조회에 있어서 Set 가 Array 에 비해 훨씬 빠릅니다. 아래의 코드를 통해 두 차이점을 비교해 보고 눈으로 확인 해 보도록 하겠습니다 import Foundation let sampleArray: [Int] = [ 1 , 1 , 2 , 3 , 3 , 3 ] var sampleSet:Set<Int> = Set([ 1 , 1 , 2 , 3 , 3 , 3 ]) print (sampleArray) // [1, 1, 2, 3, 3, 3] print (sampleSet) // [2, 3, 1] var numbers:[Int] = [] while numbers .count < 10000 { var number = Int.random( in : 1 ... 100000 ) if !numbers.contains(number){ numbers.append(number) } } sampleSet = Set(numbers) let startTime = CFAbsoluteTimeGetCurrent() print (sampleSet.contains( 98891 ) ) let processTime = CFAbsoluteTimeGetCurrent() - startTime print ( "set process time : \(processTime)" ) // set process time : 0.00021398067474365234 let star

[인터뷰질문 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 :.