2018의 게시물 표시

[Swift 공부] Swift 함수형 프로그래밍 패러다임

이미지
필자가 스위프트를 처음부터 다시보자는 목적중에 "함수형 프로그래밍 패러다임"도 한 몫 하고 있는데, 말 그대로 간단하게 보면 함수가 중심인 패러다임아라는 소리이다. 그렇게 보면 지금도 쓰고 있지 않을까? 라는 생각을 하고 있다가 스위프트에서 함수형 패러다임을 쓰게된 이유 등 좀 더 자세히 보고 필자가 생각하고 있는게 정말로 맞는지 확인하고 정확하게 파악하기 위해서 공부해 보려고 한다. 객체지향 프로그래밍 패러다임 객체지향 프로그래밍 패러다임(*OOP)은 객체지향 프로그래밍 이라고도 불리며, 객체지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위인 객체의 모임으로 파악하고자 하는 시각이다. 각각의 객체는 서로 메시지를 주고 받고 데이터를 처리한다. ( * Object-Oriented Programming Paradigm) 함수형 프로그래밍 패러다임 함수형 프로그래밍 패러달임은 최근 프로그래밍 패러다임의 대세로 떠오르고 있다. 함수형 프로그래밍 패러다임의 가장 큰 장점은 "대규모 병렬처리가 굉장히 쉽다"는 점이다. 명령형 프로그래밍과 함수형 프로그래밍의 비교 애플의 프레임워크 대부분이 객체지향 패러다임 기반으로 설계가 되어 있기 때문에 객체지향을 아예 사용하지 않을 수는 없다고 한다. 그러면서도 스위프트에서 함수형 패러다임을 강조하고 있는데, 서버영역에서 스위프트를 사용했을때 순수하게 함수형 패러다임만으로 프로그램을 작성할 수 있기 때문이다. 때에 따라서 적절하게 섞어 프로그램을 작성하는게 좋다고 본다. 위에서 설명 했듯이 iOS개발을 진행할 때는 100% 함수형 패러다임을 지향할 수는 없어보이는 구조이다. 다만 필자가 사용하고 있는 부분 중에서 예를 들어보자면, 최초 ViewDidLoad에서 실행되는 함수를 나열 하고 있는데, 이걸 배열 형식으로 구현하여, A Type일때는 5개의 함수만 B Type일때는

[Swift 공부] 스위프트 알아보기.

#. 이론 공부를 위하여, 일부 내용을 블로그 및 책을 찾아보며 작성하였습니다. Swift 1.0 스위프트는 2014년 6월에 베타 버전을 발표하고, 2014년 9월에 Swift 1.0 을 발표하였다. 안전한 코딩을 위한 안전장치 등 기존 Objective C 에서 사용하지 못했던 부분이 추가 되어 많은 관심을 받게되었다. Swift 1.2 2015년 4월 Swift 1.2 가 발표하였으며, Swift 문법이 많이 바뀌게되어 많은 혼란이 있었던 시기가 였습니다. Swift 2.0 2015년 6월 WWDC에서 Swift 2.0버전을 발표하였고, 1.x와 차이가 컸으며 이시기에 사람들이 버전이 올라갈때마다 문법이 바뀌는게 아닌지 걱정을 많이 했던 시기 인 것 같습니다. Swift 2.1 2015년 10월 발표하였으며 2.0에 비해 약간의 편의사항 추가, 버그 수정 등 안정화에 포커스를 둔 마이너한 업데이트 였습니다. 오픈소스 전환 2015년 12월 Swift를 오픈소스로 전환하였습니다. Swift 2.2 2016년 3월에 발표하였으며, 3.0 발표를 앞두고 있어서 변화가 크지 않았습니다. Swift 3.0 2016년 6월 WWDC에서 Swift 3.0 발표를 하였으며, 큰 변화가 있었습니다. 필자가 느끼기에는 기존에 Swift 문법이 Objective C를 억지로 스크립트 문법과 매핑 시켜서 최대한 비슷하고, 혼동되지 않게 만들었던 부분을 좀더 스크립트 문법 처럼 Swift만의 문법으로 바뀌었던 시기 였던것 같습니다. Swift 3.1 2017년 3월 Swift 3.1이 발표하였고, 큰변화는 아니지만 사용상에 일부 변화가 있었습니다. Swift 4.0 2017년 6월 Swift 3.1버전에 이어 언어의 스팩을 강화하였습니다. 필자의 생각 간략하게 스위프트 연혁을 참고로 적어놓았는데, 해당 버전별 중요 기능이 추가되거나 제거되거나가 있었지만, 필자도 Swift 1.0 부터 시작을 하였으나,

[iOS] CallKit 설정에서 활성화 되지 않을때

기존에 App에서 CallKit을 활용하여 앱내의 전화번호부를 등록하지 않아도 정보를 표시해주는 정도로 만 사용하고 있었는데, 일부 사용자들에게 설정 > 전화 > 전화 차단 및 발신자 확인 에서 App의 스위치를 On 으로 변경시 바로 활성화가 되지 않고, 무한로딩 이 돌고 있다는 점을 접수 받게 되었다. 이 부분에서 원인이 불명확했는데, iPhone X, iPhone XS, iPhone XS Max, iPhone XR 의 기기에서 발생하는게 대다수 인점이 있었다. 추가적으로 iPhone XS Max 의 기기를 최근에 구입하여 동작을 시켜봤는데, 실제로 위와같이 로딩이 무한으로 돌고있는 점을 확인을 하였다. 일단 필자도 웹검색을 통해 알아본 결과 iPhone에 설치된 CallKit을 사용하고 있는 앱이 여러개일때, 혹은 최초설치시에 위와 같은 현상이 발생하는 것으로 파악을 하였고, 이 현상은 2016년 11월 부터도 발생한 것으로 판단된다. 후스콜이나 후후 등 CallKit이 주요기능인 앱의 정보를 확인해보니, CallKit을 여러개 사용하고 있을 경우 충돌로 인해 설정이 되지 않을 수 있다고 한다. 필자가 실험해본 결과 1. 필자의 App 만 설치한경우 (무한 로딩일때)   - iPhone 재부팅 후 정상 작동 2.  후스콜 등 이미 CallKit 을 사용하고 있는데, 추가설치된 경우 (무한 로딩일때)   - iPhone 재부팅 후 정상 작동   #. 만약에 CallKit 중에 같은 번호가 있다면, 이 상황 문제가 발생하여 다른앱들을 지우고 다시 설치후 재부팅 해야함. 이 현상을 정확하게 문제 해결을 하고 싶긴한데, 코드에서는 정상적으로 호출하고 있어서 난감한 상황이다.

[요리] 에어프라이어 도전기! [삼겹살 편]

이미지
에어프라이어 요리도전하기! 드디어 세번째 포스팅으로  자취인들이 가장 많이 해보고싶은  에어프라이어 삼겹살 구이를 준비해 보았다. 전체적인 조리과정 1. 구매한 삼겹살을 자르지 않고 에어프라이어에 이쁘게 넣어준다. 2. (저온 요리) 160도에 10분씩 3번 정도 위치를 바꿔준다. 3. 겹쳐져있는 부분은 잘 안익을 수 있음으로 확인하고 마지막으로 조금더 돌려준다. 일단 필자의 포스팅 순서는 세번째 지만, 에어프라이어로 가장 많이 해본요리이다. 보통 에어프라이어 상단에 고기는 180도 / 20분 ~ 25분 이라고 써있는데,  이렇게 하면 겉은 너무 바삭해서 먹기에는 불편했다. 몇번에 시도 끝에 먹어보고 최적이라고 생각하는  "저온에 오래 굽기" 방법을 소개 하려고 한다. 와이프랑 마트에서 장을 보다가 냉동으로도 보관하려고 구매한 삼겹살을 에어프라이어를 통해서 삼겹살 구이를 해보려고 한다! (저렴하게 사서 기분좋음) 에어프라이어 요리를 할때 가장 중요한점은 음식을 최대한 겹치지 않아야 한다는 점 이다. 요리를 하다보면 어쩔 수 없이 일부는 겹치는 부분이 생기지만, 최초 음식을 넣을때 최대한 안겹치게 만들어줘야 나중에 여러번 더 해야하는 수고를 덜 수 있다. 1차로 160도에 10분을 돌려준다. 이번 삼겹살 구이의 핵심은 저온 으로 여러번 작업하는 것이다! 1차 초벌이 완료되면 많이는 익지 않은 상태이다. 만약에 초벌을 높은 온도에서 하면 겉은 바싹한데,  내부는 익지 않는 불상사가 이뤄지기 때문에 일부로 저온에서 작업을 시작한 것이다! 2번째로 에어프라이어 요리시 중요한 부분! 잘 익는 위치의 고기와 덜 익는 고기의 위치를 변경해주면서 다시  160도 10분 돌려준다.     (위치 변경중...) 이렇게 160도에 10분을

[iOS] NSURLCache 삭제 및 WKWebKit WebSite Cache 삭제

이번에 정리할 내용은 iOS Xcode 내에서 Cache를 삭제하는 법 에 대해서 알아보려고 한다. 기존에 사용하고 있던 프로젝트는 UIWebView를 사용하다. iOS 속도 문제로 WKWebView로 변경하여 사용하고 있었는데, 기존 프로젝트 최초부터 지원 하던 버전에 iOS 8.0 (현재는 iOS 10.0) 이다. 당연히 앱을 실행할 때마다 캐시 삭제하는 로직을 넣어 주어 사용하고 있었는데, 이번 회사 서버패치 때, 캐시가 되면 안된다는 문제가 발생하여, 생각보다 이상하게 시간을 허비하여 캐시 삭제하는법을 다시 적는다. 일단 소스 코드를 참고 하자면, 첫번째 라인만 사용하고 있어서 당연히 Cache를 삭제를 하고 있다고 생각했는데, WkWebView의 webSite는 Cache삭제를 하고 있지는 않았다. 1 2 3 4 5 6 7 8 // 지정된 캐시 삭제 NSCachedURLResponse를 모두 제거한다. [[NSURLCache sharedURLCache] removeAllCachedResponses];          // 지정된 날짜 이후에 웹사이트 데이터를 제거한다. NSSet  * webstieSet  =  [NSSet setWithArray:@[WKWebsiteDataTypeDiskCache,                                           WKWebsiteDataTypeMemoryCache]]; NSDate  * date  =  [NSDate dateWithTimeIntervalSince1970: 0 ]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:webstieSet modifiedSince:date completionHandler:^{}]; cs 그래서 추가한 코드로 WKWebView에서 특정날짜 이후로 WKWebView에서 호출한 WebSite를 삭제하는

[iOS] FrameAnimation, CABasicAnimation 간략 알아보기

이미지
오늘은 FrameAnimation과 CABasicAnimation 두가지를 간단하게 알아보려고 한다. 아마 상황에 따라서 쓸 수 있는 Animation의 종류들이 있겠지만, 오늘은 간단하게 반복하는 Animation으로 알아보려고한다. (이런것도 있다 정도로 봐주시면 될 것 같습니다.) Git : Animation Sample Project FrameAnimation 필자의 프로젝트내에서 FrameAnimation이 내부에 많은 편인데, 보통은 고정자리에서 image를 반복적으로 보여주기 위해서 사용하는 경우가 많다. 아래와 같이 반복적인 이미지의 경우 FrameAnimation으로 구성하면 간편하게 구현할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /// Frame Animation      func  setFrameImageView() {          /// ImageArray init          let  frameImageArray  =  NSMutableArray()          // 이미지 이름때문에 아래와 같은 for문으로 만듬.          for  i  in   10. . < 21  {             frameImageArray.add(UIImage.init(contentsOfFile: Bundle.main.path(forResource:  "icon\(i)@2x" , ofType:  "png" ) !  )  as  Any)         }                  frameImageView.animationImages  =  frameImageArray  as ? [UIImage]         frameImageView.animationDuration  =   0. 75         frameImageVie

[실험] Macbook Pro 충전기 실험 (1개, 2개 속도차이)

이미지
회사에서 Macbook Pro 를 두대를 가지고 있는데,  문득 1개 로 충전할 때와 2개 로 충전할 때의 속도 차이가 궁금하여,  블로그 포스팅하게 되었다. (뻘짓) 딱 10분씩 충전 실험을 하였으며, 1개 : 54%   10분뒤  64% 2개 : 64% 10분뒤  73% 당연히.. 실험하기 전에 충전이 되는 Max 값이 존재 할 것이라고 생각하였는데 역시나 그랬듯 ^^.. 뻘짓이였다. 궁금증 해결 끝!

[iOS] CGGeometry (CGRectContainsRect, CGRectIntersectsRect) 알아보기

이미지
AppleDeveloper (CGGeometry)  CGPoint, CGRect 데이터 구조를 포함한 함수들의 집합입니다. 가장 기본적으로 이미들 사용하고있는 CGPointMake, CGRectMake, CGSizeMake 등 을 사용하고 있었으며, 이번에 프로젝트에서 우연찬게 CGRectContainsRect(return BOOL), CGRectIntersectsRect(return BOOL) 을 사용할 기회가 있어서 정리와 함께 포스팅하려고 한다. CGRectContainsRect  : 사이트 참조 bool CGRectContainsRect(CGRect rect1, CGRect rect2); rect1 : 해당 정보에 포함되어있는지 검사할 대상 rect2 : rect1에 포함하는지 검사하려고 하는 대상 CGRectIntersectsRect  : 사이트 참조 bool CGRectIntersectsRect(CGRect rect1, CGRect rect2); rect1 : 해당 정보에 일부가 포함되어있는지 검사할 대상 rect2 : rect1에 일부가 포함하는지 검사하려고 하는 대상 우선 간단하게 Storyboard 를 통해 빨강View, 초록View, 하얀View 3가지를 만들고, 1. 초록View 과 빨강View 는 약간 걸친상태 2. 빨강View 과 하얀View 는 빨강에 포함되어있는상태 3. 초록View 와 하얀View 는 아예 포함되어있지 않은상태. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 // 1. 초록View 와 빨강View 일부겹쳤는지, 완전겹쳤는지 확인.      if  (CGRectContainsRect(self.greenView.frame, self.redV

[요리] 에어프라이어 도전기! [토스트 편] (설탕, 마요네즈)

이미지
에어프라이어 요리도전하기! 두번째 포스팅으로 간편한 토스트 편을 준비해보았다. 매번 아침에 준비해봐야지 하는데, 전날 과음 혹은 귀차니즘으로 인해 못하고 있다가 정상적인 주말의 아침을 맞이하여 (설탕 마요네즈)토스트를 준비해 보았다. 전체적인 조리과정 1. 토스트를 에어프라이어에 먹기 좋은크기로 자른다. 2. 용기에 토스트를 넣고 약간의 설탕과 마요네즈를 바른다. 3. 200도에 5분! 간단하게 돌려준다. > ps. 200도 2~3분 쯤에 중간중간 확인하기 두번째 전체적인 조리과정 1. 남은 토스트를 용기에 넣는다. (설탕 x, 마요네즈 x) 2. 160도에 5분! 돌려준다. 작업시작전 결과부터 말씀드리면! 위에 두과정중에 첫번째는 먹을만 하였으나 너무 구워진느낌이였고, 두번째 과정은 너무 수분기가 아예없어진 느낌이라 먹기 힘들었다. ps. 설탕 마요네즈보다 버터를 바르면 딱 좋을것 같다! 다음번에 다시 도전! 에어프라이어에 토스트를 도전하려고 했을때 삼각형 모양으로 잘라서 시도해보면 어떨까? 해서 토스트를 잘라서 시작하겠다.  짜잔! 이쁘진 않지만, 일단 1차적으로 삼각형 모양으로 컷팅! 에어프라이어에 동글동글한 모양으로 1층만 쌓아주고 진행! 설탕을 소량! 토스트에 뿌려주었습니다. (해당 블로그 포스팅 하려기 앞서 와이프가 설탕, 마요네즈, 달걀로 해봤는데, 너무 맛있었어요) 그래서 간단하게 하고 싶어서 달걀만 빼고 진행해봤습니다. 마요네즈 일부로 조금만 발라봤습니다. 200도에 5분! 위에 말씀드렸지만 2~3분 단위로 확인해보시는게 좋습니다. ....... 사실 원했던 비주얼은 아니였지만, 맛은 생각보다 좋았습니다! 딸기잼을 좋아해서 저는 같이 곁드려서 먹었습니다. (꿀맛!) 추가적으로 비주얼이 아쉬워서 160도에 5분을 해봤는데,

[iOS] AFNetworking Get filename (HTTP Head Content-Disposition filename)

이미지
기존 업무에 사용되는 (위의 이미지) 화면중에 webview안에 링크를 통한 첨부파일 다운로드 시스템이 존재하였는데, 원래 규약정보대로면,   http://도메인?name=123.jpg .... 등등 paramater 정보에 첨부파일의 이름정보를 가지고, 첨부파일을 저장 및 전달하는 기능을 구현해 놓았다. 어느순간 규약이 틀어짐으로 인하여 정보가 안오는 경우가 발생하여, 예외처리겸 해당 값이 없을때, filename을 구하고자 작업한 내용이다. 해당 URL 값을 HTTP Head로 통신하여, response 값을 구한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 < NSHTTPURLResponse:  0x600000dec5c0 >  { URL: http: //----비밀----//     Connection  =      (          "keep-alive"     );      "Content-Disposition"   =      (          "attachment; filename=\"123.jpg\""     );      "Content-Length"   =      (          62218     );      "Content-Type"   =      (          "application/octet-stream"     );     Date  =      (          "Mon, 15 Oct 2018 04:57:49 GMT"     );     Server  =      (         nginx     ); } } Colored b

구글블로그 깔끔 소스코드정리 (Color Scripter)

이미지
기존에 먼저 블로그 포스팅에서 소개시켜드린  (Color Scripter 블로그포스팅)  에서 기존 네이버 블로그에서는 발생하지 않았던 이상현상 해결법 겸으로 포스팅 합니다. 블로그 글쓰기시에는 Color Scripter 에서 코드를 복사한 내용은 정상적으로 표현되고 있습니다. 그러나, 실제로 포스팅 후에는 각 라인별로 줄간격이 원하는 형식처럼 노출되지 않고 있습니다. 다른 블로그 소스코드 적용하는 코드들도 존재하지만, 간단하게 사용하기에는 Color Scripter가 좋다고 판단하여, 블로그 작성시 표현을 다시 원래대로 돌리는 방법에 대해 설명하려고 한다. https://colorscripter.com/  해당 Site를 통해서 소스코드를 입력한뒤, [세부설정] 메뉴를 통해 기타 > HTML태그 자체 복사를 체크 후 저장하여, [클립보드에 복사] 합니다. 다소 불편하지만, 블로그에 추가하기전에 1가지 작업이 추가되었습니다. 저는 Sublime Text를 통해, 해당 HTML을 붙여넣고, "white-space:pre" -> "white-space:nowrap" 으로 강제 치환 해줍니다. pre, nowrap 외에도 속성값은 더 있으며, 참고용으로 적어놓는다. (필자는 Objective C, Swift 언어를 주로 하다보니 속성이 정확히 어떤값인지 몰라서 이참에 찾아보았다.) white-space 내부에서의 자동 줄 바꿈 여부를 나타내는 값을 설정한다. 속성값 normal : 기본값으로 글자 줄이 자동으로 바뀐다. 콘텐츠가 요소의 너비를 초과할 경우 다음 줄로 바뀐다. nowrap : 줄 바꿈이 실행되지 않는다. 콘텐츠가 다음 줄로 바뀌지 않는다. pre : 줄 바꿈과 기타 공백이 유지된다. 이 가능한 값은 !DOCTYPE 선언에서 표준 준수 모드를 지정할 경우에 지원된다. !DOCTYPE 선언에서 표준 준수 모드를 지정하지 않으면 이 값을 검색할 수는

iPhone Device 별 Size 정보

이미지
요즘은 개발당시 AutoLayout 덕분에 Point 계산을 통한 Code작성의 빈도수가 거의 없지만, 기기별 Size는 알고 있는 것이 중요하다. 특히, 아래 Site에서는 기기별 실제 Display Size 및 PPI 정보 등을 이미지로 잘 표현 되어 있어서 매 해마다 디바이스가 나오면 참고할 겸 들어가 보곤 한다.  [Paint Code] iPhone Device Sizes 필자가 예전부터 자주 보는 Site 인데, 여기는 원래 애니메이션 및 이미지를 직접 코드로 만들어 주는 Site로 유명하다. 최근에 추가되어 있는 폰의 정보까지도 표기되어 있어서 개발시 참고하면 좋을것 같다.