8월, 2020의 게시물 표시

[swift] 클로져 개념 잡고 가기

이미지
[swift] 클로져(closures)_v2 함수라고 알고 있던 클로져를 공부하면서 기록합니다. 어느 순간 이해가 안되는 코드들이 클로져로 이루어져있다는 것을 알게된다음 정리와 적용과정이 필요하다는 것을 알고 정리해 놓습니다. 클로저란? 클로저 는 코드에 전달되어 사용할 수있는 독립적인 기능 블록입니다. Swift의 클로저는 C 및 Objective-C의 블록 및 다른 프로그래밍 언어의 람다와 유사합니다. 라는 정의가 공식문서에 적혀있습니다. 하지만 이 개념은 이해가 가지 않았고, 개인적으로는 이름이 없는 함수이고 축약을 위한 다른 규칙들이 있다라고 이해하고 있습니다. 클로저의 문법 함수의 생김새와 사용방법 let name = "hyunho" func printName() { print(name) } printName() // hyunho 클로져의 생김새 let name = "hyunho" let printName = { print(name) } printName() // hyunho 함수같이 생겨서 구조를 뜯어보았습니다. // 함수 func 함수이름(파라미터) -> 리턴타입 { (코드 블럭) } // 클로저 { (파라미터) -> 리턴타입 in (코드 블럭) } 클로져 축약과정 아래의 예시를 들어 함수를 사용하는 방법과 클로져의 사용을 정리해 보겠습니다. 기본설정 func squared(i: Int) -> Int{ i * i } squared(i: 5) // 25 let array = [1,2,3,4,5] squared 함수를 만들어 놓고, 5를 입력하면 25를 반환합니다. 리스트를 만들어서 하나씩 입력 해보겠습니다. 함수와 클로저 사용 // 함수를 매개변수로 전달 let arrayFunctionUsed = array.map(squared) print(arrayFunctionUsed) // [1

[swift] Codable이 뭔지도 모르는 사름을 위한 글

이미지
Codable Codable 프로토콜 API서버와 통신을 하면서 Codable프로토콜을 채택해서 사용해 보았습니다. JSON의 데이터 구조와 맞아야 하는 것 같다는 느낌만 있어서 어떻게 구성되어있고, 어떻게 사용해야하는지 정리해 놓겠습니다. 먼저 애플의 공식문서 에 들어가서 살펴보겠습니다. Codable is a type alias for the Encodable and Decodable protocols. Encodable과 Decodable을 각각 알아야 하는군요. 그럼 알아보겠습니다. Encodable 내가 가진 데이터를 외부의 데이터 타입으로 인코딩 할 수 있게 해주는 프로토콜 입니다. 아래 코드를 가지고 예를 들어보겠습니다. 데이터를 가지고, json을 만들어 보겠습니다. 데이터를 담을 모델이 필요하겠죠? 간단한 모델을 하나 작성해 줍시다. struct Fruit { var name: String? var color: String? } let banana = Fruit(name: "Banana", color: "Yellow") Fruit 이라는 모델을 하나 만들고, 데이터를 넣어 즙니다. 이 데이터를 어떻게 json의 형태로 Encoding을 할 수 있을 것인가? 최족 목표는 아래와 같은 json을 만들어 주는 것 입니다. 무엇을 넣어주면, json으로 만들어 줄 수 있는 걸까요? /// Encodes the given top-level value and returns its JSON representation. /// /// - parameter value: The value to encode. /// - returns: A new `Data` value containing the encoded JSON data. /// - throws: `EncodingError.invalidValue` if a non-conforming floating

[swift] 입문자를 위한 Generic에 대한 기초 개념

이미지
Generic에 관하여 제네릭에 대해 알아보자 제네릭이라는 단어를 듣고 여러 타입을 가리키는 타입변수 라는 정의만 알고있고 실제로 제네릭을 쓰기만 하고 구현해보지 않아 익숙하지 않은 부분이 존재하는 것 같아서 직접 함수를 구현해보면서 온전하게 이해해 보도록 하겠습니다. 설명은 애플 공식문서에 잘 나와있기 때문에 참고하였습니다. 문서 보러가기 제네릭이 왜 필요하게 되었지 편리한 것들은 과거에 어려움이 있었기 때문에 그 문제를 해결하기 위해서 생겨나겟 되었습니다. 제레릭이 어떤 문제들을 해결하기 위해 생겨났는지 살펴보겠습니다. 아래의 코드를 한번 살펴보시죠. func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) // someInt : 107, anotherInt : 3" 쉬운 예제네요. 두 변수의 주소값을 입력 해주면 두 변수의 값이 서로 바뀌어 있습니다. 이 함수를 잘 쓰고 있다가, Double형이나 String 형도 변환할 일이 생기면 다음과 같이 추가로 구현해 주어야합니다. func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a a = b b = temporaryA } func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let temporaryA = a a = b b = temporaryA } 와… 그러면 같은 기능에 변수의 타입이 다를 경우 전부 다 구현해주어야 하는걸꺼요? 그래서 생긴 개념이 이 제네릭입니다. 그럼 어떻게 사용

[dev] 싱크, 어싱크, 블로킹, 논블로킹을 정확하게 모르는 사람을 위한 글

이미지
블로킹 논블로킹 싱크, 어싱크, 블로킹, 논블로킹을 정확하게 모르는 사람은 바로 저 입니다. Synchronous VS Asynchronous 한국어로 동기와 비동기입니다. 동기는 2개의 작업이 있을 때, 첫 번째 작업의 종료시점과 두 번째 작업의 시작시점이 닿아있으면 sync 입니다. 보통 함수를 연달아 호출했을 때 순차적으로 출력이 된다면 Synchronous한 작업입니다. 비동기는 동기와 반대로 작업의 시간을 맞추지 않는 것 이죠. blocking VS non-blocking 기술 적으로 구분이 되며 함수의 호출을 생각하면 이해가 빠르기 때문에 함수호출로 설명하겠습니다. 볼로킹은 어떤 함수가 호출되고 작업이 끝날 때까지 반환값을 넘겨주지 않는 것을 블로킹 되었다고합니다. 논블로킹은 어떤 함수가 호출되고 작업이 요청된다음 반환값을 넘겨주면 논 블로킹 되었고합니다. 블로킹/동기, 블로킹/비동기, 논블로킹/동기, 논블로킹/비동기 이렇게 4개의 조합이 있을 수 있습니다. 언제쓰이고 어떻게 써야하는지 정리해보겠습니다. 블로킹/동기 예를 들어보겠습니다. 카페에서 손님이 줄을 서 있습니다. 1번, 2번, 3번. 캐셔가 주문을 받습니다. 1번손님 아메리카노 4잔. 캐셔가 주문을 받고 커피를 내립니다. 1번손님을 포함한 모든 손님은 기다립니다.(블로킹상태) 캐셔는 작업이 완료되면 1번손님에게 커피를 전달합니다. 1번 손님은 커피를 받아 카페에서 일을 시작합니다.(동기) 2번손님, 3번손님 순서대로 주문을 받아 전달을 합니다. 2번, 3번은 1번의 음료를 만들 때 아무것도 하지 못하고 기다리고 있습니다. 음료는 순서대로 나옵니다. 블로킹/비동기 예를 들어보겠습니다. 카페에서 손님이 줄을 서 있습니다. 1번, 2번, 3번. 캐셔(B작업)가 주문을 받습니다. 1번손님(A작업) 아메리카노 4잔. 캐서는 1번손님에게 자리에 앉아 일하고 계시면 불러주겠다고 합니다. 1번

맥에서 공공데이터 한글 깨짐현상 해결 방법

이미지
맥에서 공공데이터 한글 깨짐현상 어려운 방법들이 많아 간단한 방법을 소개하려고 합니다. 데이터 분석을 하려고 찾아 힘들게 찾은 데이터. 서울 열린데이터 광장 에서 받은 데이터를 맥에서 열었는데? 아 깨진다. 해결 방법을 찾아보니 엑셀로 열어서 뭐 해주고 해주고 저장해주기. 하지만 내가 받은 데이터는 굉장히 크고, 또 내 컴퓨터는 너무나 느린데… 혹시 더 쉽게 할 수 있는 방법이 없을까? $ iconv -f cp949 -t utf-8 [원래 파일이름] > [새 파일이름] 끝. 간-결 $ file -I [새 파일이름] 명령어를 입력해보면 text/plain; charset=utf-8 내가 원하던 그 형태가 맞습니다!

Xcode에서 storyBoard없이 개발하기 - Tabbar 만들기

이미지
Xcode에서 storyBoard없이 개발하기 - Tabbar 만들기 개인적으로는 스토리보드를 가지고 개발하는 것이 좋다고 생각합니다. 하지만 스토리 보드 없이 개발을 하면 완벽하게 어떤 과정이 UI적인 storyBoard를 통해서 동작하는지 알 수 있기 때문에 만들면서 공부하면서 기록을 남겨놓습니다. 스토리 보드없이 개발 할 수있는 환경을 구축했다면, Tabbar를 사용해서 2개의 tabbarItem을 가진 앱을 만들어 봅시다. 구조 스토리 보드가 없기 때문에 어떤 구조를 가지고 있는지 머리에 명확히 가지고 시작해야 합니다. 우리가 만들 앱의 큰 틀은 하나의 tabbar에 2개의 view가 각각 navigationController로 조작을 하는 구조입니다. tabbarController 추가 window?.rootViewController 부분에 rootViewController를 설정해주어야합니다. 우리는 tabbar를 컨트롤 할 tabbarController 를 할당해 주겠습니다. let tabbar = UITabBarController() UITabBar.appearance().tintColor = .systemGreen tabbar.viewControllers = [네비게이션컨트롤러1, 네비게이션컨트롤러2] window?.rootViewController = tabbar 이렇게 2개의 네비게이션 컨트롤러를 tabbar에 추가해 줄 수 있습니다. 각 view추가 tabbar를 만들었으니 이제 각 탭을 넣었을 때, 호출할 view들을 추가해줍니다. // first tabBarItem let searchVC = SearchVC() searchVC.title = "search" searchVC.tabBarItem = UITabBarItem(tabBarSystemItem: .search, tag: 0) UINavigationController(rootViewCont

[dreamin] Dreamin iOS Academy 지원 후기

이미지
Dreamin iOS Academy 지원 후기 Dreamin iOS Academy 지원 후기 다음 기수가 있다면, 이 글이 도움이 되길 바라며 정리해 놓습니다. SNS에서 우연히 광고를 보았고 바로 지원했습니다. 무료 강좌이며 전문가의 교육을 제공받을 수 있다. 장비를 제공 받을 수 있다. 팀 프로젝트로 결과물을 만들 수 있다. 원격 학습이다. 크게 이 세가지가 마음에 들어 지원을 했습니다. 또한 크게 손해보는 부분이 없어 보였습니다. 서류 -> 온라인 테스트 -> 온라인 면접 -> 결과 다음과 같은 순서로 진행되었습니다. 서류 다른 서류와 크게 다르지 않았습니다. 지원동기와 자기소개를 작성했습니다. 특이한 점은 만들고 싶은 앱을 적는란이 있었습니다. 이 코스는 전문가 육성과정이 아니라 쓸모있는, 사용자가 좋아할 만한 앱을 만드는 과정이라는 생각이 들어 평소에 필요해서 만들고 싶었던 앱에 대해 소개를 넣었습니다. 온라인 테스트 당연히 비전공자와 코딩경험이 없는 사람 대상이기 때문에 코딩테스트가 나오지 않을 것이라고 생각했습니다. 논리적인 사고와 코딩을 하는데 필요한, 디버깅을 하는데 필요한 컴퓨팅적인 사고를 가지고 있는지에 대한 테스트였습니다. 온라인 면접 개인적인 느낌에 이 과정을 끝까지 수료할 수 있는지에 대한 것을 묻는 느낌이었습니다. 다른 사람들과 협업을 해본적은 있는지? 어려움이 있었다면 어떻게 해결했었는가 같은 질문이었습니다. 또한 온라인 강의를 꾸준히 들을 수 있는가, 왜 이 코스를 들으려 하는가, 단순히 리워드 콜렉터인가를 체크하는 느낌이 많은 질문들이 었습니다. 결과 최종 합격했습니다. 앞으로 과정을 들으면서 배우는 내용에 대해 매주 포스팅 하겠습니다. 노트북을 지급받지 못하는 것은 안타깝지만 제가 배운 것을 나누어 드리겠습니다.