본문 바로가기

All

(38)
[iOS] DispatchSourceTimer로 일시정지 구현이 쉬운 타이머 만들기 스택오버플로우에 일시정지와 재시작이 가능한 Timer를 구현하는 방법에 대한 질문에 Timer를 invalidate 시켰다가 새로운 Timer를 할당하는 등의 까다로운 방법들로만 답변이 달린 것을 보았습니다. 내가 본 질문과 답변들.. Pausing and Resuming a Timer in iOS Swift : Pause and Resume NSTimer 만약 DispatchSourceTimer를 알고 있더라면 좀 더 쉽게 해결가능한 문제입니다. 1초마다 시간을 출력해야 한다면 아래처럼 Timer를 만들 수 있습니다. var timer: DispatchSourceTimer? if timer == nil { // 1 timer = DispatchSource.makeTimerSource(flags: [],..
[SwiftUI] 버튼 스타일 (ButtonStyle) 만들어 쉽게 재사용하기 앱 하나에 사용하는 버튼 스타일은 보통 규격화되어 있습니다. 따라서 버튼을 추가할 때마다 해당하는 스타일 값을 일일이 세팅하게되면 매우 수고스러운 일일 것입니다. UIKit을 사용하고 있다면 UIButton 클래스를 상속받아 커스텀 클래스를 활용하여 이 문제를 해결하였을 것입니다. SwiftUI에서는 ButtonStyle 프로토콜을 채용한 구조체를 만들어 쉽게 버튼 스타일을 재사용할 수 있습니다. ButtonStyle을 적용하지 않은 Button Button(action: viewModel.refresh) { Text(viewModel.refreshButtonTitle) } .frame(width: 230, height: 45) .font(.system(size: 14)) .foregroundColor(..
[SwiftUI] AutoLayout의 Center Y 처럼 비율 위치를 구현하는 방법 UI를 구현할 때, 오토레이아웃(AutoLayout) 방식으로 디자인 가이드를 구현해왔다면 SwiftUI를 처음 맞닥뜨리게되면 조금 당황스러울 수 있습니다. UI 그리는 개념이 완전히 다르기 때문입니다. 뭔가 안드로이드에서 UI를 그리는 방식과 닮은 느낌이 납니다. 오늘은 제가 받은 디자인 가이드에서 조금 난해했던 부분을 공유하고자 합니다. 디자인 가이드 예시는 다음과 같습니다. 초록색 원의 Y 위치가 고정값(pt)이 아닌 비율(%)로 나타내어져 있습니다. AutoLayout을 사용했다면 아래 처럼 간단하게 해결했을 것입니다. 하지만 SwiftUI 에서는 이런 방식이 불가능 합니다. 어떻게 하면 그나마 간단하게 구현할 수 있을지 고민 하였습니다. 해결 방법은 GeometryReader, VStack, S..
[SwiftUI] Property wrappers for data flow SwiftUI 는 애플리케이션에서 일어나는 데이터 흐름을 관리하는 몇 가지 도구들을 제공합니다. Swift 5.1 에 추가된 Property wrapper는 변수의 기능을 한 단계 업그레이드 시켜줍니다. SwiftUI 에도 특정한 wrapper가 있습니다. 바로 @State, @Binding, @ObservedObject, @EnvironmentObject 입니다. 이 wrapper들은 변수에 의해 표현된 데이터에 대한 View의 의존성을 선언하는 역할을 합니다. 설명이 너무 어렵나요? 그럼 하나씩 살펴보도록 하겠습니다. 😎 @State @State 로 지정된 변수들은 View가 해당 변수들을 소유(own)합니다. 일시적인 것이 아닌 View가 메모리에 살아있는 한, 해당 변수는 메모리에 할당되어 있음을..
CocoaPods vs Carthage vs Swift Package Manager 코코아팟(CocoaPods) 장점 사용하기 쉽다. Dynamic, Static 라이브러리를 모두 지원한다. (1.5.0 버전 이상) 의존성의 의존성까지 자동으로 관리해준다. 누구나 쉽게 어떤 의존성이 애플리케이션에 있는지 알 수 있다. pod outdated 명령어로 쉽게 새로운 버전이 있는지 체크할 수 있다. 거의 대부분의 라이브러리가 코코아팟을 지원한다. 👍 단점 라이브러리를 다운받아 설치(pod install or update)하는데 오랜 시간이 걸린다. 프로젝트를 빌드 할 때마다 모든 팟 라이브러리가 같이 빌드되므로 다른 도구를 사용할 때 보다 프로젝트 빌드 시간이 느리다. 카르타고 (Carthage) 장점 Dynamic, Static 라이브러리를 모두 지원한다. (0.30.0 버전 이상) 의존성..
[iOS] 클래스의 모든 프로퍼티들이 궁금할 땐? 디버깅을 하다보면 특정 인스턴스에 어떤 프로퍼티들이 어떤 값들로 할당되어 있는지 로그로 남겨 한 눈에 보고싶을 때가 있습니다. 이 때 사용하면 유용한 방법을 공유하도록 하겠습니다! extension NSObject { func properties() -> [String] { var results: [String] = [] var count: UInt32 = 0 let myClass: AnyClass = self.classForCoder // 프로퍼티들 리스트 조회 let properties = class_copyPropertyList(myClass, &count) for index in 0..
MIT License 란? 오픈소스 라이선스에 대해 오픈 소스를 사용하다 보면 매우 흔하게 MIT License 라 칭해져 있는 것을 발견할 수 있습니다. 그렇다면 그 많은 오픈 소스들을 MIT에서 모두 만든것일까? 결론 부터 말하자면 아닙니다. MIT License (엠아이티 라이선스) 의 경우, 미국 매사추세츠 공과대학교(MIT)에서 해당 대학의 소프트웨어 공학도들을 돕기 위해 개발한 라이선스입니다. 이 라이선스의 내용을 요약해보면, (참조: MIT 허가서) 1) 이 소프트웨어를 누구라도 무상으로 제한없이 취급해도 좋다. (단, 저작권 표시 및 이 허가 표시를 소프트웨어의 모든 복제물 또는 중요한 부분에 기재해야 한다.) 2) 저자 또는 저작권자는 소프트웨어에 관해서 아무런 책임을 지지 않는다. 정리 이해가 쉽도록 정리하자면 MIT 라이선스가 표기되어..
[iOS] NSPredicate 문법 정리 NSArray를 필터링 할 때, CoreData를 사용할 때 Predicate 문법을 사용하여 필터링 하곤 합니다. 이 때 주로 사용하는 문법들을 정리해보겠습니다. let request: NSFetchRequest = Entity.fetchRequest() let predicate = NSPredicate(format: "id == %@", id) request.predicate = predicate CoreData에서 데이터 조회(fetch)할 때 사용하는 방식은 대부분 위와 같을 것 입니다. NSPredicate 생성자 중 format 문자열에 검색조건을 지정하는 방법을 주로 사용합니다. format 문자열은 대소문자를 구별하지 않습니다. Predicate Keyword 들은 대문자로 작성하는 것이 ..