Lullaby Recipe

이미지
  How to use Lullaby Recipe Type your username. 2.  Go to Kitchen tab to create your new recipe. 3.  Select the sound you like and tab ‘Blend’ button. 4.  Name and save your own mix. 5. Listen to your own recipe. If needed, control the volume for each sound.

SwiftUI에서 뷰를 떼어내는 방법

이미지
SwiftUI에서 UI를 그리다 보면, 뷰를 따로 떼어내서 작업을 해야하는 경우들이 발생합니다. 글로 설명해서는 상상하기 어려우니 아래 코드를 보면서 이야기 해보겠습니다. struct ContentView : View { var body : some View { VStack { VStack { Text ( "리이오" ) Rectangle () .fill (Color.red) .frame ( height : 30 ) Text ( "올리비아" ) } .background (.green) Button { print ( "done" ) } label : { Text ( "Button" ) } } } } 우리의 코드는 VStack 안에 또다른 VStack과 Button이 있습니다. 저 사용자 이름이 들어있는 VStack이 복잡해질 경우 따로 떼어내서 작업을 하는 경우가 많습니다. 일단은 body가 길어지면 보기 힘들기 때문이죠. 이 때 사용하는 방법에는 여러가지가 있지만 오늘은 2개를 비교해 보겠습니다. 새로운 Struct를 만든다 새로운 뷰를 그리기 위해서 새로운 struct를 만들어서 그리는 방법이 있습니다. 이전 코드보다 보기가 한결 쉬워졌습니다. 또 ProfileView 부분이 늘어나도 ContentView는 늘어나지 않아서 가독성도 좋습니다. struct ContentView : View { var body : some View { VStack {

Self Check In 앱 설명 글

이미지
이 글은 Self Check In 앱의 사용 법을 설명 해 놓은 글 입니다. 1. You can scan QRCode by camera 2. When you scan valid QRCode, You can check data at calendar 3. You can make profile by Sign In with Apple 4. You can create QRCode by create group 5. Also you can join group 6. Enter group code  

[인터뷰질문 020] raw strings 이란 무엇인가요?

이미지
관련주제 : Swift  난이도 : 하 raw strings raw strings 는 swift5에 추가된 자연스러운 String을 쓰는데 도움을 주는 기능입니다. 지연스러운 String은 어떤 걸까요? 아래의 문자열을 비교해 보겠습니다! let naturalString = # "" Hello world! "" # let unNaturalString = "\"Hello world!\"" print(naturalString) // "Hello world!" print(unNaturalString) // "Hello world!" 익숙함에 따라 어떤 문자열이 더 자연스러운지가 다를 수 있을텐데요, 설명을 드리자면 # 기호 사이에 "" 이렇게 문자열을 나타내주는 기호가 있다면, 그 사이에 있는 어떤 특수 문자도 자연스럽게 처리해줍니다. 기존에는 \ 기호를 특수 문자 앞에 붙여서 이 기호가 특수 기호인지 나타낼 필요가 없습니다. 말 그대로 자연스러운 문자열을 만들 수 있는 것입니다. 만약 문장 안에 # 기호를 사용해야 한다면, ## 기호를 문장의 시작과 끝에 붙여주면 됩니다. 활용법 기존에 문자열 사이에 변수를 넣는 방법과 다르니 유의 해주세요! let name = "Leeo" let normalString = "Hello, \(name) !" let rawString = # "Hello, \#(name)!" # let wrongRawString = # "Hello, \(name) !" # print (normalString) // Hello, Leeo! print (rawString) // Hello, Leeo! print (wrongRawString) // Hello, \(name)! 메리트 특정 상황에서 사용했을 때, 메

[인터뷰질문 019] property observers란 무엇인가요?

이미지
프로퍼티와 옵져버 swift를 쓰다보면, 다양한 프로퍼티들이 있습니다. 쉽게 변수라고 알고있죠. 그리고 옵져버는 관찰자 혹은 감시자 정도로 번역할 수 있는데요. property observers 를 직역해보면 변수 관찰자 정도가 될테고, 그 내용은 프로퍼티의 수정사항을 탐지하는 것 입니다. 즉 프로퍼티(저장 프로퍼티)에 변경사항이 생기면, 옵져버가 알려주고, 특정 코드블럭을 실행할 수 있습니다. 글로만 설명하면 어려우니 코드를 통해 알아보도록 하겠습니다. class PointCounter { var totalPoint: Int = 0 { willSet (newTotalPoint) { print ( "점수의 합을 \(newTotalPoint) 점으로 변경할 예정입니다." ) } didSet (oldTotalPoint) { print ( " \(totalPoint - oldTotalPoint) 점이 변경되었습니다." ) } } } let pointCounter = PointCounter () // 점수의 합을 200점으로 변경할 예정입니다. pointCounter.totalPoint = 200 // 200점이 변경되었습니다. // 점수의 합을 300로 변경할 예정입니다. pointCounter.totalPoint = 300 // 100점이 변경되었습니다. // 점수의 합을 200점으로 변경할 예정입니다. pointCounter.totalPoint = 200 // -100점이 변경되었습니다. willSet didSet 이름부터 매우 직관적이죠? 이름에서 부터 알 수 있듯이 willSet은 프로퍼티가 변경되기 바로 직전에 호출 됩니다. 그리고 예상한 대로 didSet은 프로퍼티가 변경된 직후에 호출 됩니다. 그러니 우리가 pointCounter.totalPoint 를 500으

2년만에 개발자를 멈춘 iOS 개발자의 2021년 회고

이미지
2020년의 시작과 함께, iOS개발을 시작하게 되었었고, 1년이 지난 시점에 회고를 작성했었습니다. 이제는 3년차 iOS개발자가 되면서 구상하게 된 회고는 작년에 기대했던 내용들과 많이 달라서 스스로도 놀랐습니다. 가능한 순서대로 정리해보도록 하겠습니다. 월간 리이오 (1월 1앱 출시) 2년차 iOS개발자가 되면서 엄청난 자신감과 함께, 호기롭게 세운 1월 1개인앱 프로젝트인 월간 리이오를 시작했습니다. 결과부터 정리하면 망했습니다. 한 달에 한개의 앱을 만들 수는 있지만 3개째를 만들던 때에 그만두게 되었습니다. 그 이유를 천천히 생각해보니 문제점이 몇가지 있었습니다. 1. 똑같은 구조와 기술을 반복해서 쓰는것에 재미를 못느낀다 한 달이라는 기간내에 빨리 만들어야 하다보니까, 이전에 만들었던 구조, 코드들을 계속 쓰고 있는것에 지루함을 느끼게 되었습니다. 물론 같은 것을 반복하면서 익히는 것도 중요하다고 생각합니다. 하지만 개인앱은 내가 공부하고 싶은 것들을 녹여서 개발하는게 지속적인 동기부여의 방법으로 더 적절하다는 결론에 도달했습니다. 또한 어떻게 하면 더 나은 코드를 생산할 수 있을지에 대한 고민도 필요합니다. 2. 새로운 앱을 계속 만드는 것보다는 기존에 만든 앱을 고도화 하는게 낫다 개인적인 취향의 차이 이겠지만, 아주 간단한 기능들을 계속 만드는 것보다는 사용자를 생각하거나 아니면 만들어 보고 싶었던 기능들을 계속 만드는게 좀 더 완성도 있는 앱을 만드는게 아닌가 라는 생각을 했습니다. 갯수에 집작하는 것이 아닌 결과물의 퀄리티에 좀 더 집중할 필요가 있다고 생각했습니다. 마치 1일 1커밋의 연속일수에 집중할 필요가 없다고 느낀것과 같은 맥락입니다. 3. 번아웃을 유발한다 매일 무언가를 만들고 또 기존의 존재하는 문제를 해결하는 즐거움은 개발을 하는 가장 큰 이유라고 생각합니다. 하지만 퇴근 후, 주말에 계속 이 생각들만 하다보니 어느 순간 너무지쳐있는 자신을 발견했습니다. 매월 앱을 만들어 내는 것은 나의 라이프 싸이클과 맞지 않

클로져를 이해할 때 따라 쳐 보면 좋은 예제 코드

이미지
어쩌다 보니 클로져를 공부하면서 정리하는 글이 점점 많아집니다. 그만큼 중요하고, 또 많이 사용하고 있기 때문이겠죠. 오늘은 클로져를 이해하면서 사용했던 샘플 코드를 정리해보았습니다. 함수 vs 클로져 함수를 정의하고, 그 함수를 호출하는 것은 많은 분들이 익숙할 것이라고 생각합니다. 보통 다음과 같은 코드를 보면 이해할 수 있죠. func sayHi () { print ( "Hi" ) } sayHi() // Hi 클로져는 이름 없는 함수라고 하죠? 이름이 없는 함수를 만들고 이름을 붙여서 호출 해 보겠습니다. let sayHiClosure = { print( "Hi" ) } sayHiClosure () // Hi 그러니까 잘 살펴보면 클로져 앞에 이름을 붙이고 func 키워드 까지 붙이면 함수랑 똑같이 생겨지는 군요! 매개변수, 반환타입 여기서 부터 헷갈리기 시작합니다. 위의 예제는 아무값도 입력받지 않고 반환하지 않는 아주 단순한 형태입니다. 그렇다면 숫자를 2개 입력받아서 합을 구하는 함수와 클로져를 만들고 비교해볼까요? func sum(_ a : Int, _ b : Int) -> Int { return a + b } print (sum( 3 , 6 ) ) // 9 let sumClosure: (Int, Int) -> Int = { a , b in return a + b } print (sumClosure( 2 , 5 ) ) // 7 결국 우리가 하고 있는 행위는 이름없는 클로져에 이름을 붙이고 있는 것 입니다. 그러면 이쯤에서 왜 클로져를 쓰는가에 대해서 생각해 보아야 합니다. 언제 함수? 언제 클로져? 위 예제에서 두 숫자를 더해서 합을 반환하는 함수를 위에서 만들어 보았습니다. 그렇다면 뺼샘과, 나눗셈과, 곱셈은 어떨까요? 우리의 함수를 쓸지 안쓸지도 모르는데 구현해 놓는다면 너무나 힘들 것 입니다. 그냥 (Int, In