10월, 2020의 게시물 표시

[dev] Hacktober Fest 2020 참가하세요 두 번 하세요!

이미지
[dev] Hacktober Fest 참가하세요 두 번 하세요! 올 해 초부터 오픈소스에 관심을 가지고, 저도 모두를 위한 오픈소스에 컨트리뷰터가 되고자 이런 저런 노력을 했었습니다. 결과는 대 참패… 물론 어떻게 오픈소스를 시작하는지도 공부했고, 첫 커밋을 어떻게 하면 좋을지에 대해서도 공부했었습니다. 하지만 결국 기여하고자 하는 오픈소스를 열어보았을 때 으악! 하고 덮어 버린 것… 이번에는 올 해 엿보고 있던 핵토버 페스트에 참가 해 보았습니다. 무엇을 해야하는지 몰라서 웹페이지 에 들어가서 소개글과 이벤트 들을 읽어 보았습니다. 그 중에 PR을 4번 날리면 티셔츠를 주는 이벤트에 참가 하기로 했습니다. 규칙은 간단했습니다. hacktoberfest2020에 참가하는 레파지토리에 PR을 4번 이상 날린다. 유예기간인 14일 이 지날 때 까지 내가 날린 PR에 Reject 이 없거나 Accept 이 있으면 됩니다. 총 4개의 최종 카운팅이 완료되면 보상을 받을 수 있습니다. 시작 그 와중에도 어떻게 하면 좋을지 찾아보다가 이런 필터 를 사용해서 기여할 만한 프로젝트를 찾았습니다. 저는 초보자 이기 때문에 good first issue 와 swift 로 제한을 두고 찾았습니다. 매너? 기여 했던 프로젝트 중 참고할 만한 내용이 있어서 공유 합니다. 이슈 창에 들어가보면 현재 문제라고 제기 된 이슈들이 있고, 담당자가 없는 곳에가서 참가 의사를 밝혀달라고 합니다. 만약 다른사람이 이미 진행하고 있는 이슈라면 해당 레파지토리에 가서 기여해달라는 내용이 있습니다. 이렇듯 오픈소스에서도 지켜야 하는 예의가 있었습니다. 몰랐었는데 다른 것도 있는지 찾아봐야겠네요. 일합니다 할 수 있는 이슈에 가서 자신에게 할당해달라고 합니다. 그러면 프로젝트 메인테이너?인지 어떤 분이 오셔서 흔쾌히 할당을 해줍니다. 당연히 저는 처음이라 잘 모르니 어떻게 하는지 고민할 시간에 다시 물어봅니다. ...

[swift] Optional 뜯어보기

이미지
[swift] Optional 뜯어보기 swift에서 데이터를 저장하는 곳을 변수라고 하는데, 이 변수에 아무것도 들어있지 않은 상태를 표현해야 할 일이 있습니다. 0이 아니고 빈 문자열("")도 아닌 아무것도 없는 것. 변수에 아무것도 할당 되어있지 않은 것을 스위프트에서는 참을 수 없으니까요! 아무것도 들어있지 않다라는 것이라도 넣어 둡시다. 이때 사용되는 것이, 없다 라는 오브젝트인 nil입니다. 변수에 아무 값도 들어있지 않다는 뜻 입니다. 사용 법 정의 타입 뒤에 ?를 붙여주면 옵셔널타입 이라는 뜻 입니다. var name: String? = "leeo" print(name!) // leeo name = nil print(name!) // error 이렇게 사용가능합니다. 조금 더 자세히 살펴보면 var name: String? = "leeo" 이 코드에서 타입이 String?임을 알 수 있습니다. 정확히는 이런 뜻 입니다. var name: Optional<String> 왜냐하면 typealias String? = Optional<String> var name: String? 이렇게 한 것과 같은 의미기 때문이죠. 그렇다면 Optional 을 까보고 똑같이 구현해 보도록 하겠습니다. public enum CustomOptional<Wrapped>: ExpressibleByNilLiteral { case none case some(Wrapped) public init(nilLiteral: ()) { self = .none } public init(_ some: Wrapped) { self = .some(some) } } extension CustomOptional: CustomDebugStringConvertible { public var debugD...

[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...