분류 전체보기 68

[iOS / UIKit] How to detect when the application state become foreground from the background in ViewController not SceneDelegate

안녕하세요! 오늘은 앱이 background 상태에 있다가 foreground로 올라오는 것을 SceneDelegate가 아니라 ViewController에서 확인하는 방법을 알아봅시다! 다들 아시다시피 SceneDelegate를 통해 우리는 앱이 Background에서 Foreground로 넘어오는 것을 확인할 수 있습니다. 물론 그 반대도 가능합니다! 하지만 특정 ViewController에서 Foreground로 넘어오는 것을 확인하는 게 필요한 상황이 있죠? 바로 알아봅시다! willEnterForegroundNotification 옵저버를 추가해주니 ViewController에서 foreground로 들어오는 상황을 notify 해주는 게 보이네요! 그럼 background로 나가는 것도 알 수..

iOS/UIKit 2023.03.03

[iOS / UIKit] How to change UIPickerView Selected Background Color

안녕하세요! 오늘 다뤄볼 주제는 UIPickerView의 Selected Row 색상을 변경하는 것입니다! 위 시뮬레이터에서 보여지는 뷰들에 대한 코드를 먼저 보여드리겠습니다! BEFORE 코드로 보시는 바와 같이 색상에 대해 별도로 설정해준 것이 없음에도 불구하고 아래와 같이 배경색이 설정되어 있는 게 보입니다. 아마 여러분들은 여러분들이 원하는 디자인이 따로 있으시겠지요? 백그라운드 색상을 변경해 봅시다! AFTER (System Yellow Color) 48~50번 Line의 Code를 주목해 주세요! 아마 높은 확률로 여러분은 아예 저 배경색을 지워버리고 싶으실 겁니다. Clear 색상을 적용해 봅시다! AFTER (Clear Color) 48~50번 Line의 Code를 주목해 주세요! 전체 C..

iOS/UIKit 2023.03.02

[iOS / UIKit] How to send email Swift

How to send email Swift 안녕하세요! 오늘은 iOS앱 개발 과정에서 Email 기능을 구현하는 방법을 알아봅시다! + Email에 파일을 첨부하는 방법도 함께 알아봅시다! 바로 전체 코드를 보여드리겠습니다! Email 기능을 활용하려면 Mail 앱에 계정이 등록되어 있어야 합니다! Mail 앱에 계정이 등록되어 있어야 if MFMailComposeViewController.canSendMail() 조건문에서 true를 받을 수 있습니다! GitHub 링크입니다! https://github.com/TDCIAN/SendEmailWithSwift GitHub - TDCIAN/SendEmailWithSwift Contribute to TDCIAN/SendEmailWithSwift develop..

iOS/UIKit 2023.02.13

[iOS / UIKit] How to use PreviewProvider in UIKit

How to use PreviewProvider in UIKit 안녕하세요! 오늘은 UIKit에서 PreviewProvider를 사용하는 방법을 알아봅시다! PreviewProvider는 SwiftUI에서만 사용할 수 있는 게 아닌가 생각하실 수 있겠지만 UIKit에서도 활용할 수 있습니다! 일단 사진부터 보시죠! PreviewProvider 부분만 확대해서 다시 보여드리겠습니다! 전체 코드도 보여드리겠습니다! UIKit 상황에서 개발한다고 하더라도 PreviewProvider를 활용하시려면 반드시 SwiftUI를 import 해주셔야 합니다! 맥북 성능에 따라 PreviewProvider를 사용하시는 게 시뮬레이터나 실기기를 활용하는 것보다 유리할 수도 있고, 그러지 못할 수도 있으니 현재 상황에 맞춰..

iOS/UIKit 2023.02.12

[Swift] 맵 삼형제(map, flatMap, compactMap)에 대해 알아봅시다

(1) map 애플 개발자 홈페이지에 있는 map에 대한 설명입니다. 배열 내부의 요소들을 매핑해서 돌려준다네요! 그런데 mapping이 뭘까요? 구글에 물어봅시다. 역시 명쾌하다! 구글! 여기 말고 이번에는 해시넷에서 봅시다(블록체인 관련된 정보들이 참 많습니다). 아까보단 훨씬 낫죠? 그래도 이해가 잘 안 될 수 있습니다. 코드로 보시죠! 바로 감이 오시나요? numbers 배열의 각 요소에 1을 더한 애들을 배열에 담아 보여 줍니다. 다른 예시를 한 번 들어볼까요? 아까 사용했던 numbers를 그대로 사용하는데, 이번에는 numbers 내부의 각 요소를 String 타입으로 활용해봤습니다. 이렇게 축약해서 쓸 수도 있습니다. 이번에는 한 번 스까서 써볼까요?? numbers의 각 요소에 3을 더한..

iOS/Common 2022.06.10

[Swift] 고차함수(map, filter, reduce)를 스윽 핥아봅시다

고차함수(Higher-order function)는 다른 함수를 전달인자로 받거나, 함수 실행의 결과를 함수로 반환하는 함수를 뜻합니다! Swift의 함수(클로저)가 일급시민이므로 함수의 전달 인자로 전달할 수 있고, 함수의 결괏값을 반환할 수 있습니다. 고러면 바로 고차함수 map, filter, reduce에 대해 알아봅시다! (1) map map은 뭘까요? 내부의 요소들을 변경(변형이 좀 더 정확합니다)해서 이를 담아 돌려주는 것입니다. 바로 봅시다! 감이 잡히시나요? Numbers 배열 내부에 있는 각 요소에 대하여 mapNumbers1에서는 1을 더해주었고, mapNumbers2에서는 아예 String으로 변환하여 사용해주고 있습니다. 이런 식으로 축약해서 사용할 수도 있습니다. 심지어 섞어 쓸..

iOS/Common 2022.06.08

[Swift] final 왜 막 갖다 붙이나요? (feat. vtable, dynamic dispatch)

우리가 코드를 짜다 보면 이렇게 final 키워드를 붙여서 쓰는 경우가 있잖아요?(반박할 시 코 쓱 닦음) 다른 사람들이 쓰니까 일단 따라 쓰긴 하는데, 이거 왜 쓰는 걸까요? Swift의 LANGUAGE GUIDE 중 Inheritance 항목의 내용을 보시면 final에 대한 설명이 나옵니다. (발 번역 주의) “여러분은 final 키워드를 메소드나 프로퍼티, 또는 서브스크립트 앞에 사용함으로써 오버라이드 되는 것을 막을 수 있습니다. (예시: final var, final func, final class, final subscript). final을 써놓고 오버라이드를 하려고 하면 컴파일 에러가 발생합니다. extension을 사용하는 경우에도 final 키워드를 사용할 수 있습니다. (이하 생략)..

iOS/Common 2022.06.06

[Swift] lazy 왜 쓰나요?

우리 iOS 개발할 때 이런식으로 lazy 많이 쓰지요? private lazy var sampleLabel: UILable = { let label = UILabel() label.text = "lazy 왜 쓰나요?" label.textColor = UIColor.systemBlue return label }() 그런데 lazy를 왜 쓰는지 알고 계신가요? lazy 키워드를 사용하는 프로퍼티를 지연 저장 프로퍼티(Lazy Stroed Property)라고 합니다. 지연 저장 프로퍼티는 호출이 있어야만 값을 초기화 하는 특성을 가지고 있습니다. 좀 더 자세히 설명해 봅시다. 우리가 인스턴스를 초기화 하는 과정에서 언제나 모든 저장 프로퍼티가 동시에 초기화 될 필요가 없는 상황이 분명히 있겠지요? 그럴 때..

iOS/Common 2022.05.13

[RxSwift] RxSwift 왜 써야 하나요?

* 본 내용은 RxSwift의 Documentation에 있는 Why.md 문서를 번역한 내용입니다. 다소간의 부정확한 의역이 포함될 수 있으니 위 이미지를 클릭하셔서 원문을 확인하시기를 권장합니다! Rx(Reactive Extensions) 왜 쓰냐면요 Rx를 사용하면 앱을 선언형 프로그래밍의 방식으로 만들 수 있습니다. Bindings Observable.combineLatest(firstName.rx.text, lastName.rx.text) { $0 + " " + $1 } .map { "Greetings, \($0)" } .bind(to: greetingLabel.rx.text) UITableView와 UICollectionView를 구현할 때도 활용할 수 있습니다. viewModel .rows ..