[swift] guard문으로 함수 입구 틀어막기!

이미지
[swift] guard 처음 가드문을 접한것은 옵셔널 체인의 guard let 에서 였습니다. 그래서인지, 오히려 if let 과 guard let 이 비슷 해 보였고 헷갈리기 때문에 정리 해 두려고 합니다. if문은 너무나 익숙 하기 때문에 따로 정리하지 않겠습니다. guard 형태는 다음과 같습니다. guard 조건 else { 조건이 false return || throw } 뭔가 if문과 비교한다기 보다는 생긴 것 그대로 해석을 해 보면, 특정 조건으로 부터 guard 해줍니다. 조건이 틀린 경우는 모두 버리고, 우리가 원하는 조건만 통과 시키겠다는 의미 입니다. 마치 성문 앞에서 통행증을 보고 통과 시켜주는 가드가 생각나는 군요. 사용 예제 guard문은 조건이 맞지 않으면 종료 시켜야 하도록 문법이 되어있기 때문에, 반드시 return이나 throw를 해주어야 합니다. 반대로 말하면 함수 내부에서 사용하도록 만들어진 녀석이죠. 함수에서 사용할 조건들에 맞지 않으면 걸러 보겠습니다. func guardTest() { let condition1: Bool = true let condition2: Bool = true guard condition1,condition2 else { return print("Bye!") } print("Come In!") } guardTest() 조건 2개를 검사하고 모두 만족할 경우에 들여보내드록 하겠습니다. 만약 조건 중 하나라도 거짓이라면 그 들은 내쫓길 것 입니다. 느낀 장점 개인적으로 느낀 장점은 코드의 가독성이 좋아집니다. 예를 들면 우리가 어떤 함수에서 실행해야 하는 조건이 3개라면, if문으로 썼을 때는 다음과 같습니다. func solution() { if condition1 { if condition2 { ...

[iOS] 버튼 클릭해서 이미지 돌리기

이미지
[iOS] 클릭해서 이미지 돌리기 앱을 만들다가, 더 보기 ^ 를 눌렀을 때 아래로 화살표가 돌아가면서 목록들이 나타나는 것을 구현할 일이 있었습니다. 위로 향하는 이미지를 누르면 아래로 향하는 이미지로 바뀌도록 코딩을 하려고 했는데 이미지를 돌릴 수 있다는 것을 알고 정리해 두려고 합니다. 버튼으로 상하 반전하기 이 방법은 어떤 버튼을 눌렀을 때 이미지를 상하로 회전시키는 방법입니다. CGAffineTransform을 이용하여 이미지를 뒤집습니다. private var isUpside: Bool = false @IBAction func turnArroundButtonClicked(_ sender: Any) { arrowImageView.transform = CGAffineTransform(scaleX: 1, y: isUpside ? 1 : -1) isUpside = !isUpside } 이미지의 x좌표 y좌표를 변경해여 이미지가 돌아간 것 처럼 할 수 있었습니다. 원래 scaleX, Y로 이미지를 늘려주는 것 이지만, y좌표를 음수를 할당 해 이미지에 반전을 주었습니다. 90도 만큼 돌리기 버튼을 눌러 이미지를 돌리다 보니, 시계방향, 반 시계방향으로 돌리고 싶을 때는 어떻게 해야하나 찾아보다가 발견한 방법입니다. 좋은 방법인지는 잘 모르겠으니, 더 좋은 방법을 아시는 분은 댓글로 달아주세요! private var count: Int = 0 @IBAction func clockWiseButtonClicked(_ sender: Any) { count += 1 arrowImageView.transform = CGAffineTransform(rotationAngle: .pi * 0.5 * CGFloat(self.count)) } @IBAction func reverseClockWiseButtonClicked(_ sender: Any) { cou...

[iOS] Kingfisher 둘러보기

이미지
[iOS] Kingfisher 둘러보기 이미지 서버에서 이미지를 가져다 표시해줄 때 항상 쓰던 라이브러리 입니다. 어떤 기능이 있는지 살펴보기 전부터 웹에서 주소로 이미지를 가져올 때는 항상 써서, 이미지를 불러오는 라이브러리 인 줄 알았습니다. 하지만 본래의 목적은 이미지 캐싱이라는 것을 알게 되었고, 이번기회에 어떤 기능이 있는지 살펴보겠습니다. 내용은 Cheat Sheet 를 참고했습니다. 이미지 로딩 저도 이 기능 때문에 사용하는 줄 알았던 이미지 로딩입니다. 사용법은 굉장히 간단합니다. 이미지 뷰를 포함해(NSImageView, UIButton and NSButton)에 Extension 으로 구현되에 있기 때문에 setImage 를 사용해 이미지를 설정하면 됩니다. import Kingfisher let url = URL(string: "https://example.com/image.png") imageView.kf.setImage(with: url) 내부의 동작과정은 다음과 같습니다. url.absoluteString 로 캐싱된 이미지가 있는지 확입합니다. 만약 이미지가 캐싱되어 있어서 찾으면(메모리, 디스크 중), imageView.image에 나타냅니다. 만약 찾지 못한다면, url로 요청을 날려 이미지를 다운받습니다. 다운받은 데이터를 UIImage object로 변환합니다. 변환한 이미지를 메모리나 티스크에 캐싱합니다. 이미지 뷰에 표시합니다. 이미지 다운로드 이미지뷰이 이미지를 설정할 때 캐싱이 되어있지 않으면 다운로드 합니다. case .network(let resource): let downloader = options.downloader ?? self.downloader let task = downloader.downloadImage( with: resource.downloadURL, options: opti...

dream iOS 아카데미에서 첫 4주 차 배운 내용들

이미지
dream iOS 아카데미에서 첫 4주 차 배운 내용들 맥북을 받고 기다리고 있는건 프로그래밍의 기초보다는 한 서비스를 만드는 방법의 시작이었습니다. Swift Playground 프로토 타이핑 iOS HIG Swift Playground 다운로드 링크 이 것 하나만 있으면 아이패드 본전을 뽑을 수 있다는? 강력한 프로그램 입니다. iOS만이 아니라 기초적인 프로그래밍적 사고를 할 수 있도록 도와주는 게임입니다. 각 스테이지를 클리어하면서 프로그래밍에 다가갈 수 있는 좋은 교육도구입니다. 저희도 공부할 때에 그냥 하세요 했던 것은 아니고 동영상을 참고할 수 있도록 첨부해주셨습니다. 친절하게도 유투브에 모두 공개가 되어있기 때문에 공유 드립니다. 스위프트 하이 채널 여러분도 코딩배우기 1부터 시작해 보시죠! 프로토 타이핑 프로그래밍과 별개로 나는 어떤 앱을 만들 것인가에 대한 생각을 했습니다. 페르소나, ADS 와 같은 것에 대해 공부했습니다. 그러면서 또한 나는 어떤 앱을 만들까 그려보기도 했습니다. 피그마, 스케치, Xds 가리지 않고 사용방법은 웹에 물어물어 익혀서 했습니다. 중요한건 나의 생각의 구체화 하는 것 이었으니까요. 실제 구현가능 여부는 중요하게 생각하지는 않았습니다. iOS HIG (Human Interface Guidelines) iOS앱 개발의 경전이라 불리며, 개발하기전에 꼭 꼭 두번, 세번 읽어야 한다고 하셨습니다. 사용자를 위한 디자인 가이드라고 생각하시면 됩니다. 저도 한 번만 빠르게 읽었는데 기회가 된다면 번역작업까지 할 수 있었으면 좋겠습니다. 양이 좀 많지만 막 너무 어려워서 시간을 들여야 하는 부분은 아니기 때문에 꼭 꼭 읽어보세요! HIG 링크 정리 이렇게 처음 한달은 앱 개발에 필요한 기초체력에 대핸 설명을 듣고 방향을 정하는 작업을 했습니다. 혹시 dreamin iOS Academy에 참여했더라면 나도 앱을 만들 수 있었...

[iOS] iOS14 UIPageControl 써보기

이미지
[iOS] iOS14 UIPageControl 써보기 기존의 UIPageControl과 다른 부분이 추가되어서 대응을 해야 할 부분이 있는지 살펴보았습니다. UIPageControl 소스코드에 들어가서 살펴보도록 하겠습니다. 여러분의 페이지 컨트롤이 클릭을 통해 이동이 가능하다면, 아마 iOS14 업데이트에서 영향을 받았을 확률이 큽니다. 주석의 내용들은 삭제 해 두었으니 궁금하신 분들은 한번 찾아가서 읽어봐도 좋을 듯 합니다. 새로운 상태, 스타일 UIPageControl의 새로운 상태와, 백그라운드 스타일이 추가되었습니다. 0은 아무런 인터랙션이 없는 상태, 1은 1칸을 움직이는 상태, 2는 꾹 누른상태에서 주르르륵 이동하는 상태 입니다. 배경같은 경우 automatic은 꾹 누르지 않았을 때는 투명 꾹 누르면 반투명인 상태가 됩니다. prominent이면 반투명, minimal이면 투명입니다. @available(iOS 14.0, *) public enum InteractionState : Int { case none = 0 case discrete = 1 case continuous = 2 } @available(iOS 14.0, *) public enum BackgroundStyle : Int { case automatic = 0 case prominent = 1 case minimal = 2 } } 프로퍼티들 backgroundStyle 은 위의 설명에 따른 페이지 컨트롤의 배경설정을 가능하게 합니다. interactionState 상태를 읽을 수 있게 해줍니다. allowsContinuousInteraction 연속적인 인터렉션이 가능하게 할 것인지에 대한 여부입니다. preferredIndicatorImage 커스텀 페이지 뷰를 만들 수...

[iOS] swift lint를 코코아 팟 없이 사용하기

이미지
[iOS] swift lint를 코코아 팟 없이 사용하기 스위프트로 프로그래밍을 하면서 swift 코딩스타일 에 맞춰서 코딩을 하도록 도와줄 장치를 찾아보니 swiftLint를 만나게 되었습니다. 사용 방법에 대한 설명을 공식문서 에 제일 잘 나와있기 때문에 첨부만 해 놓겠습니다. 기존의 프로젝트와는 다르게 코딩의 규칙은 설치되어 있어야 하기 때문에 $ brew install swiftlint 로 설치 해줍니다. Xcode를 실행해서 타겟에 새로운 "Run Script"을 눌러서 추가해 줍니다. if which swiftlint >/dev/null; then swiftlint else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi 설치 후 실행하면 에러나 워닝들이 빡! autocorrect 옵션을 추가해주면, 빌드 했을 때 autocorrect 해줍니다. if which swiftlint >/dev/null; then swiftlint autocorrect else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi 빈 파일을 추가해 줍니다. 이름은 반드시 .swiftlint.yml 여야 합니다. 그리고 추가한 파일 안에 규칙들을 적어놓습니다. 규칙 보러가기 # By default, SwiftLint uses a set of sensible default rules you can adjust: disabled_rules: # rule identifiers turned on by default to exclude from running - colon - co...

[swift] Self VS .self

이미지
[swift] Self VS .self 코딩을 하다 보니, Self.name 을 쓸 때고 있고, leeo.self도 있어서 self라는 키워드는 언제 어떻게 써야하는지에 대해 정리해 놓겠습니다. Self Self 라는 키워드 는 자기 자신의 동적 클래스를 가리킵니다. 아래의 코드를 보시면 Self는 클래스 자기 자신을 가리켜 Self. 으로 인스턴스의 프로퍼티나 메소드에 접근할 수 있는 것을 볼 수 있습니다. class Student { class var name: String { return "Leeo" } func printName() { print(Self.name) } } class Leeo: Student { override class var name: String { return "hyunho" } } let student = Student() student.printName() let leeo = Leeo() leeo.printName() .self .self 를 이해하려면 Metatype에 대해서 알아야 합니다. 이 글의 주제는 아니기 때문에 .self를 언제 사용하는지에 대해서만 간단히 정리하겠습니다. 아래의 결과가 모두 이해된다면 당신은 이미 .self에 대하여 알고 있는 것 입니다! 아니라면 Metatype에 대해서도 공부해 보시길 권해드립니다. let word = "testString" print(word is String) // true print(word is String.Type) // false print(type(of: word) is String.Type) // true print(type(of: word) == String.self) // true //print(type(of:...