들어가며MVVM을 왜 써야하는지 공부하다 의존성 주입이라는 키워드를 알게 되었다.MVVM을 사용하려면 의존성 주입 개념 이해가 필수적이라는 주변 말과 검색 결과를 보고 탐구하게 되었다.의존성 주입이란?의존성: 어떤 객체가 다른 객체의 기능에 의존하고 있다는 뜻이다.주입: 의존 객체를 내부에서 직접 만들지 않고 외부에서 주입받는다는 뜻이다. 내부에서 직접 만드는 방식class ViewModel { let repository = Repository()}외부에서 주입받는 방식class ViewModel { let repository: RepositoryType init(repository: RepositoryType) { self.repository = repository }..
들어가며나는 현재 애플 아카데미에서 Apple Technology를 최대로 활용한 결과물을 만들어야 하는 Challenge중이다.내가 선택한 기술은 HomeKit이다. 전자공학과를 졸업했다보니 iot에 관심이 있었고 하드웨어를 만질 수 있을거란 기대감에 골랐다.Challenge의 솔루션 컨셉은 동화책을 읽어줄 때 HomeKit을 활용해 실감나게 읽어주는 컨셉으로 잡았다. 상황에 맞게 공간을 디자인 하고 싶은 내 의도를 보고 주변 러너가 던져준 아이디어다.아이디어는 팀원과 디벨롭시켜 공간 디자인 + 참여형 동화로 결정됐다.참여형 동화는 아이가 특정 행동을 하면 스토리가 진행되는 것을 말한다.(예: 도끼를 네 번 휘두르는 동작을 하면 콩나무가 잘리며 거인이 떨어짐)아이폰과 아이패드를 연결해야 하는 이유위의 ..
등수 매기기 문제를 풀던 중 평균 점수가 높은 순으로 정렬한 배열에서 학생의 평균점수를 넣어 index를 찾아야했다. [90, 56, 23, 11] // 평균 [90, 56, 23, 11].firstIndex(of: 56) // 1 반환 [90, 56, 23, 11].index(of: 56) // 1 반환 [90, 56, 56, 23, 11].firstIndex(of: 56) // 1 반환 [90, 56, 56, 23, 11].firstIndex(of: 23) // 3 반환 [90, 56, 56, 23, 11].index(of: 56) // 1 반환 [90, 56, 56, 23, 11].index(of: 23) // 3 반환 결론 firstIndex와 index로 찾을 수 있는데 둘 다 요소의 첫 번째 ..
function 공부 중 throws라는 개념을 배우다 알아야 할 내용이라 유튜브 야곰님 영상을 참고해 공부했다. 비밀번호입력 함수 같은 오류가 발생할 수 있는 함수를 만들 때 먼저 오류의 케이스를 나눠줘야한다. 이렇게 비밀번호가 틀렸을 때와 비었을 때 두 가지로 나눠줬다. 그 다음 비밀번호를 입력하는 함수를 작성한다. 파라미터 괄호 뒤에 throws를 입력해서 오류가 발생할 수 있음을 나타낸다. 함수 내에선 조건문을 통해 throw로 오류 케이스를 던져준다. 이렇게 오류가 발생할 수 있어서 throws를 작성한 함수는 do catch try를 통해 호출해야한다. do { try //오류가 발생할 수 있는 함수 }catch 에러 케이스 { //에러일 때 실행할 코드 } 를 기본 형태로 생각하면 된다. 여..
function 공부 중 How many parameters should a function accept? 이라는 질문에 순간 꽂혔다. https://www.hackingwithswift.com/quick-start/understanding-swift/how-many-parameters-should-a-function-accept hackingwithswift에선 "한 String의 길이가 어느 정도까지 길 수 있나요?"와 같은 질문이라고 했다. 간단히 말하면 답이 없다는거다. 아예 안쓸 수도 있고 20개를 쓸 수도 있다. 그래서 최대한 효율적으로 적은 파라미터를 사용하기를 권장한다. 그게 잘 쓴 코드니까. 반복문을 써서 100개까지 만들어봤는데 문제없이 잘 됐다. 10000개를 도전해봤다. 맥 사양만 ..
var age: Int! = 24 var name: String? = "Mun" 옵셔널은 ?와 ! 두 가지 표현 방식이 있다. ?는 일반 옵셔널 !는 암시적 언래핑 옵셔널(implicitly unwrapped optionals)이라고 한다. 이 둘의 차이점을 알고 싶었다. 먼저 공통점부터 살펴봤다. 1. 두 옵셔널 모두 value나 nil을 포함할 수 있다. 2. 옵셔널 바인딩을 통해 언래핑 이후 값을 사용할 수 있다. 그렇다면 차이점은 무엇일까? 먼저 일반 옵셔널은 값을 사용하기 위해서 위의 예시처럼 반드시 언래핑 과정을 거쳐야한다. 하지만 암시적으로 언래핑된 옵셔널은 그 과정이 필요없다. 그래서 다음 예시처럼 사용가능하다. 이 과정을 일반 옵셔널로 바꿔보면 다음과 같이 동작한다고 생각하면 된다. 이렇..
옵셔널 값을 사용하기 위해서 꼭 해줘야하는 작업이다. 옵셔널을 언래핑하는 방법은 5가지가 있다(옵셔널 체이닝이라는 방법도 있지만 나중에 다뤄보려고 한다. 추후 여기에 추가할 예정) 1. 강제 언래핑 (force unwrapping) 사용하고자 하는 옵셔널타입의 인스턴스에 !를 붙이면 된다. 이 방식은 편하지만 옵셔널 값이 nil인지 체크하지 않기 때문에 불안전한 방식이라고 한다. 2. 암시적 추출 옵셔널 (implicitly unwrapped optional) 타입을 명시할 때 ?가 아닌 !를 붙이는 방식이다. 호출할 때 따로 언래핑 할 필요 없이 일반 변수나 상수처럼 사용가능하다. 예시처럼 별도의 작업 없이 변수로 사용가능하고 값도 바꿀 수 있다(nil도 부여가능하다). 3. if let nil여부를 ..
let arr = ["2000","09","06"] arr을 for문으로 Int로 변환하려는 과정에서 생긴 일이다. import Foundation let str = ["2000","09","06"] var newStr:[Int] = [] for i in str{ newStr.append(Int(i)) } 코드는 이렇게 작성했다. 그런데 사진과 같은 에러 메세지가 나왔다. 엥? 난 옵셔널을 쓴 적이 없는데 왜 언래핑을 하라고 하는거지,,, 이해할 수 없었다. 이유는 문자열을 정수로 변환하는 과정에 있었다. Int로 문자열을 정수로 변환할 때, 문자열이 정수로 완벽하게 파싱될 수 있어야 한다. 하지만 만약 문자열이 유효한 정수가 아니라면, 변환은 실패하고 nil을 반환한다. 따라서 예시와 같은 문제를 해결..