난 iOS개발자 (53) 썸네일형 리스트형 Swift의 Property 저장 속성 Stored Property - 가장 단순한 형태의 속성 - 일반적인 인스턴스의 상수 또는 변수 - 변수 저장은 var, 상수 저장은 let init과 함께 인스턴스를 초기화 할 때 저장속성에 기본값을 제공할 수 있다. struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, lenth: 3) rangeOfThreeItems.firstValue = 6 이 때 rangeOfThreeItems가 let으로 할당 된 인스턴스라면 FiexdLengthRange의 firstValue의 속성이 var(변수)여도 수정이 불가하다. 이것은 값 유형인 s.. Timer로 작업 예약하기 타이머는 실행되어야 할 작업들을 특정 시간 간격을 두고 실행할 수 있게 해준다. 타이머는 RunLoop와 동작하며, 타이머를 효과적으로 이해하려면 RunLoop 가 어떻게 동작하는지 알아야 한다. (정리 필요) 타이머로 작업 예약하는 방법 1. 타이머의 클래스메서드를 사용하여 타이머를 생성하고 현재 런 루프에 자동 등록 timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { t in self.updateCount() }) timeInterval: 타이머로 지정된 작업의 시간(초)간격. 만약 0.0초를 사용하려 한다면 0.1로 사용하라고 한다. repeats: 타이머의 반복 여부. 무효화될 때까지 지정한 Interval 로 blo.. 정확한 위치 정보 이전 글[https://greate-future.tistory.com/89] 에 이어서 ... iOS14부터 정확한 위치정보를 수집할 수 있다. 위치정보 수집승인을 요청하면 아래와 같은 팝업이 발생하는데, 지도가 보이는 View에 “정확한 위치: 켬”이 보인다. 이 부분을 터치하면 끔으로 바뀌게 되는데 지도도 축소되고 내 위치의 범위가 수킬로미터로 늘어나게 된다. 한 눈에 봐도 정확한 위치를 안쓴다고 따악 알려주는구나. 정확한 위치정보를 수집하지 않으면 사용자의 위치를 제대로 가져오기가 힘들다. 만약 앱이 네비게이션같은 기능을 사용해야 하다면 반드시 정확한 위치에 접근 하도록 코드를 수정해야한다. 정확한 위치 정보를 사용하는 앱의 동작을 한번 예시로 보겠다. 네이버 지도앱에서 정확한 위치 권한을 끄고 켰.. 위치 정보 가져오기(CoreLocation, CLLocationManager) 위치권한이 필요한 프로젝트를 진행하면서, 계속 검색을 하다가 이제는 필요한 내용을 기록해야 겠다는 생각이 들어서 작성한다. 사용자의 위치권한을 받아야 하는 경우는 많지만 개인적으로 필요한 이유는, Wi-Fi 정보를 읽기 위해서였다. 디바이스가 붙어있는 Wi-Fi 정보를 가져오려했더니 위치정보를 켜야한다나… 이쪽은 또 처음이다 보니 일단은 그런가 보다 하고 시작했다. 1. CoreLocation 위치정보를 가져오기에 앞서 import 해야할 Framework이다. https://developer.apple.com/documentation/corelocation Apple Developer Documentation developer.apple.com coreLocation은 장치의 지리적 위치, 고도, 방향.. Code Coverage 확인하기 테스트코드가 앱의 실제 코드를 어느정도까지 테스트하고 있는지 그 진행도를 확인 할 수 있다. 1. Product -> Scheme -> Edit Scheme 2. Test -> Option Code Coverage 에 Gather coverage 체크 3. CodeCoverage 확인 Command + U 단축키를 눌러 테스트 코드 실행 후 ReportNavigation탭으로 이동하면 Coverage가 보인다. Unit Test 작성해보기2 이전 내용(https://greate-future.tistory.com/86)에 이어서 로또 번호를 검증하는 기능에 대해 테스트를 해보자. LottoMachine은 아래와 같이 번호검증 메서드를 갖는다. struct LottoMachine { func isValidLottoNumbers(of numbers: [Int]) -> Bool { guard numbers.count == 6, Set(numbers).count == 6 else { //1 return false } for num in numbers { //2 guard 1...45 ~= num else { return false } } return true } } //1 isValidLottoNumbers로 전달된 numbers의 요소 갯수 검사를.. Unit Test 작성해보기1 @testable 테스트케이스를 작성하기에 앞서 UnitTest파일의 상단에 아래와 같은 형식으로 코드를 작성 해줘야 한다. @testable import "타겟 이름" @testable은 Unit Test가 실제 앱 타깃에 있는 코드에 접근 하도록 하는 키워드이다. 위 @testable 은 UnitTestSample 이라는 타겟에 접근하기 위한 것으로, 보통의 앱 코드는 기본적으로 Internal 접근제어를 갖게 되는데 testable 키워드를 통해 테스트 하는 동안 다른 타겟에서 접근을 허용하도록 해주는 것이다. 아래 구조체에 대한 테스트 케이스를 작성해보자. struct StrangeCalculator { func addNumbers(of numbers: [Int]) -> Int { return n.. Unit Test 파일 살펴보기 프로젝트 네비게이터에서 여섯번째 탭으로 이동하고 , 왼쪽 하단의. + 버튼을 눌러서 New Unit Test Target을 선택해준다. setUpWithError() setUpWithError는 각각의 테스트 케이스가 실행되기 전 마다 호출된다. 각 테스트 케이스를 모두 같은 같은 조건에서 실행될 수 있게 하는 메서드이다. 만약 테스트 케이스 A와 B가 같은 리소스를 사용하여 테스트를 하고 있을 때, 각 케이스가 다른 테스트 케이스로 인해 변경된 리소스를 사용해야 한다면 정상적인 테스트가 이뤄지지 않을 것이다. setUpWithError()는 이러한 현상을 방지하기 위해 초기화 코드등이 들어가는 부분이다. tearDownWithError() setUpWithError와 반대로 각각의 테스트 케이스 실행이.. FIRST 원칙 Fast 테스트는 빠르게 동작해야 한다. 프로젝트 규모에 따라 테스트 코드도 늘어나게 되고, 많은 테스트 코드는 시간을 소요하게 된다. 테스트 코드는 빠르게 확인하고, 수정할 수 있어야 의미가 있다. Independent/Isolated 각 각의 테스트는 독립적으로 동작하며, 서로 의존해선 안된다. 코드간 의존성이 높으면 테스트가 실패 했을 경우 원인을 찾는것에 어려움을 겪을 수 있으며 테스트 진행에 차질을 불러오기도 한다. Repeatable 테스트는 언제나 같은 결과를 내야한다. 매번 예상한 결과대로 테스트가 진행되게 해야한다. Self-Validating 테스트의 성공 여부는 테스트 코드 내부에서 스스로 검증 가능해야 한다. Timely 테스트 코드는 실제 코드를 구현 하기 직전 구현해야만 효율적이.. JsonString 에서 Dictionary로 변환 extension String{ func convertToDictionary() -> [String: Any]? { if let data = data(using: .utf8) { return try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] } return nil } } 이전 1 2 3 4 5 6 다음