| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- rxswift
- Hello
- Tistory
- 후기
- 부스트캠프
- 개발
- Design Pattern
- development
- 알고리즘
- 커스텀 뷰
- ios #swift #uialertcontroller #메서드 스위즐링
- 디자인패턴
- Swift
- SwiftUI
- WWDC
- boostcamp
- Algorithm
- 코코아 인터널스
- notion
- 부트캠프
- World
- OS
- Opensource
- IOS
- 네이버 부캠
- Cocoa Internals
- 단위 테스트
- Today
- Total
목록Programming/Swift (9)
꿈돌이랜드
최근 테스트 코드에 대해 공부하고 있는데, 결국 테스트 코드를 작성하기 위해선, 테스트 하려는 코드 자체가 테스트가능한 구조여야 가능하다. 그러면 어떻게 해야 처음부터 테스트 가능한 구조로 코드를 작성하는 습관을 들일 수 있을까? 에 초점을 맞춰 이 글을 작성했다.1. 의존성을 직접 생성하지 말고, 외부에서 주입받아라테스트 불가능한 코드의 가장 흔한 원인이다. 객체 내부에서 의존성을 직접 생성하면, 테스트 시 그 의존성을 교체할 수 없다.AS-ISclass ProfileViewModel { private let repository = UserRepository() private let analytics = AnalyticsManager.shared func loadProfile(userI..
코드를 작성하다 보면 종종 이런 형태를 보게 된다.Date()Locale.currentUserSession.shared.currentUserAppEnvironment.apiClient함수의 파라미터에는 아무것도 없지만,코드 어딘가에는 당연히 존재한다고 가정되는 값들이 있다.이 글에서는 이런 패턴을 앰비언트 컨텍스트(Ambient Context) 라고 부르고,왜 이것이 테스트 코드를 작성할 때 안티 패턴으로 여겨지는지 정리해본다.앰비언트 컨텍스트란 무엇인가앰비언트 컨텍스트는명시적으로 전달되지 않지만, 전역적으로 접근 가능한 실행 문맥 정보를 의미한다.주로 다음과 같은 형태로 나타난다.전역 변수싱글톤 객체static 프로퍼티Thread-local / Task-local 값플랫폼이 암묵적으로 제공하는 상태예시..
Swift Concurrency사내에서 Swift Concurrency 스터디를 진행했습니다.Swift Concurrency는 Swift5.5 버전 부터 도입된 Swift 언어 차원의 비동기 처리 방식입니다Documentation이 글에서는 개인적으로 Swift Concurrency를 공부하면서 중요하게 깨달은 내용에 대해 서술합니다.1. 어떤 actor에 해당 변수, 함수가 “선언”되어있는지가 중요하다.GCD의 경우 선언이 중요한게 아니라 런타임에 어떤 dispatchqueue에 해당 작업이 들어가서 실행되는지가 중요했습니다.Swift Concurrency의 경우는 해당 변수와 함수가 “선언된 위치”가 곧 어떤 스레드(엄밀히 말하면 actor)에서 동작할지를 결정합니다.이를 흔히 다양한 교육자료에서 격..
Result연관 값을 포함한 success 또는 failure를 나타낼 수 있는 타입제네릭 enum 타입으로 선언되어있다. Failure는 반드시 Error 프로토콜을 채택한 타입이어야 합니다.@frozen enum Result where Failure : Error어떤 동작의 수행결과(대표적으로 네트워킹)를 success인지 failure인지 구분해서 나타낼 수 있습니다.case로 success와 result를 가지고, 각 case의 연관값으로 제네릭타입의 넣어준 값을 저장합니다. Result의 쓰임 예시는 아래 아티클을 참조해주세요Writing Failable Asynchronous APIs오류를 동기식으로 반환하지 못할 때, API의 일부로 Result를 반환하는 것을 제안합니다.→ API의 실행 ..
Swift Array’s Shuffle()스위프트 배열에는 요소들을 뒤섞어주는 shuffle() 메서드가 존재합니다.var names = ["Alejandro", "Camila", "Diego", "Luciana", "Luis", "Sofía"] names.shuffle() // names == ["Luis", "Camila", "Luciana", "Sofía", "Alejandro", "Diego"]공식 문서에서는 RandomAccessCollection 프로토콜을 채택한 인스턴스가 사용할 수 있다고 합니다. WWDC 2018에서, 이런 셔플 알고리즘은 Fisher-Yates 알고리즘을 사용해 구현했다고 합니다.https://developer.apple.com/videos/play/wwdc2018/40..
Swift5.7 RegexSwift 5.7 이후, Swift 언어에서 정규 표현식 사용 방법이 업데이트 되었습니다. 이를 정리해보도록 하겠습니다. Swift 5.7 이전, 정규표현식을 사용하려면 다음의 것들을 사용했어야 했습니다.NSRegularExpressionNSString의 메서드 range(), replacingOccurrences() … 다음은 예시 코드 입니다.문자열 일부 일치 확인import Foundation let str = "abcd1234" let pattern = "[0-9]*" if let range = str.range(of: pattern, options: .regularExpression) { print(str[range]) // 가장 앞 부분 부터 일치하는 부분을 반환 } ..
스위프트의 구조체는 여타의 C 기반 언어의 구조체에 비해 훨씬 강력하다. 그런데 클래스는 그러면 언제 사용해야 할까?애플의 Swift Programming Language Guide에서는 다음과 같이 제시하고 있다기본적으로는 구조체를 사용하라.Swift의 구조체는 다른 언어의 클래스로 취급될 정도의 많은 기능을 포함한다.예를 들면, stored property, computed property, method 등이 있다.게다가, 프로토콜을 채택할 수 있다.구조체는 value 타입이기 때문에 앱의 상태를 고려할 필요가 없다.Objective-C 와의 상호작용이 필요할 때는 클래스를 사용하라.데이터를 처리해야 하는 Objective-C API를 사용하거나 프레임워크에 정의된 기존 클래스 계층에 맞춰야 하는 경..
Target Action우리는 흔히 UIKit를 이용하여 개발할 때 버튼이나 여러 요소들의 사용자 이벤트를 처리하기 위해 Target Action 디자인패턴의 원리를 이용해 다음과 같은 코드를 사용한다.let button = UIButton() button.addTarget(self, action: #selector(touchUpButton(_:)), event: .touchUpInside) @objc func touchUpButton(_ sender: UIButton) { //... } 헌데 실제로 어떻게 프로그램의 런타임에서 action이 실행될 수 있는 것일까? 그 원리를 알아보고자 한다.Dispatch우선 Dispatch의 개념을 알아야 한다.많은 객체지향 언어들이 상속을 통해 메소드와 프로퍼티들..