일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Cocoa Internals
- Hello
- Opensource
- 부트캠프
- notion
- WWDC
- rxswift
- development
- IOS
- 코코아 인터널스
- 개발
- OS
- Design Pattern
- Tistory
- 알고리즘
- 디자인패턴
- 단위 테스트
- 커스텀 뷰
- 네이버 부캠
- SwiftUI
- Swift
- boostcamp
- World
- 부스트캠프
- Algorithm
- 후기
- Today
- Total
목록전체 글 (47)
꿈돌이랜드
위와 같은 카카오톡의 페이지뷰를 구현해려고 하는데 이런 요구사항이 있다. 어떻게 해야할까? 요구사항 각 탭 간 슬라이드 하면서검정 인디케이터 선이 각 탭의 라벨의 하단 위치에 맞게 이동한다.검정 인디케이터 선이 각 탭의 라벨 제목의 길이에 비례해 길이가 변해야 한다.현재 뷰에 나타나는 탭의 라벨 제목 색깔이 회색에서 검정색으로 변해가야 하고, 뷰에서 사라지는 탭은 검정색에서 회색으로 변해가야 한다.UIScrollViewDelegate탭 바 하단의 뷰가 좌우 폭이 매우 큰 스크롤 뷰로 이루어져 있다고 하면, UIScrollViewDelegate를 채택하고 scrollViewDidScroll(_ scrollView: UIScrollView) 메서드를 사용할 수 있다.이 메서드는 스크롤 뷰가 스크롤 되는 동안..
SwiftUI는 UIKit와 다음과 같은 방법들로 호환시킬 수 있습니다.UIHostingControllerA UIKit view controller that manages a SwiftUI view hierarchy.SwiftUI 뷰 계층을 관리하는 UIKit의 ViewControllerSwiftUI 뷰 → UIKit 뷰 !정의class UIHostingController where Content : ViewSwiftUI 뷰들을 UIKit 뷰 계층에 통합하고 싶을 때, UIHostingViewController 객체를 생성합니다. 생성시간에, 이 ViewController의 rootView로 사용하고 싶은 SwiftUI 뷰를 지정해야 합니다. 나중에 SwiftUI/UIHostingController/ro..
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]) // 가장 앞 부분 부터 일치하는 부분을 반환 } ..
RxSwift 깃허브 저장소를 살펴보며 작성했습니다.Observable.createObservable.create를 뜯어봅시다. create 메서드는 다음과 같이 정의되어 있습니다.RxSwift/Observables/Create.swiftextension ObservableType { public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable { return AnonymousObservable(subscribe) } }create는 Observable자체가 아닌 ObservableType 프로토콜의 타입 메서드로 정의되어 있습니다.Observable은 정의에서, ObservableType을 프로토콜로..
9.1 타입 시스템스위프트 타입 시스템은 자바스크립트나 파이썬처럼 자유로운 덕 타입 시스템이 아니라 명시적인 타입 시스템이다. 오브젝티브-C 처럼 모든 객체가 다이내믹 타입은 아니지만 프로토콜 타입을 활용해서 다이내믹하게 확장하면서도 오브젝티브-C보다 안전하게 쓸 수 있다.9.1.1 스위프트 타입스위프트에는 크게 두 종류의 타입이 있다. 이름 있는 타입(named type)과 이름 없이 합쳐진 타입(compound type)이다. 이름 있는 타입은 클래스, 구조체, 열거, 프로토콜 같은 타입의 이름이 미리 정해진 형태를 말한다. 기존 타입을 상속, 확장해서 나만의 이름을 주고 새로운 타입으로 지정할 수도 있다. 라이브러리에 포함하고 있는 배열, 사전, 옵셔널 타입도 모두 이름 있는 타입이다. 오브젝티브-..
…중략…8.2 스위프트 클로저클로저는 접근 가능한 특정 범위(scope) 내에서 사용하는 값을 (함수 내부에) 갖고 있는 함수를 의미한다. 스위프트에서 함수는 모두 클로저다. 그리고 스위프트에서 클로저는 함수이거나 이름 없는 그냥 클로저 중 하나다. 일부 스위프트 함수는 오브젝티브-C 블록 객체 형태로 호환 가능하다. 반대로 블록 객체는 스위프트에서 클로저처럼 호환성을 유지하면서 호출할 수 있다.8.2.1 클로저 형식…중략…스위프트에서 함수는 당연히 다른 함수의 인자 값으로 사용할 수 있다.…중략…참조 범위가 전체인 글로벌 함수는 이름은 있지만 캡처하는 변수가 없는 클로저가 된다. 다른 함수 내부에 선언한 중첩 함수는 감싸고 있는 함수 범위에 접근 가능한 변수들을 캡처하는 이름 있는 클로저가 된다. 마지..
스위프트의 구조체는 여타의 C 기반 언어의 구조체에 비해 훨씬 강력하다. 그런데 클래스는 그러면 언제 사용해야 할까?애플의 Swift Programming Language Guide에서는 다음과 같이 제시하고 있다기본적으로는 구조체를 사용하라.Swift의 구조체는 다른 언어의 클래스로 취급될 정도의 많은 기능을 포함한다.예를 들면, stored property, computed property, method 등이 있다.게다가, 프로토콜을 채택할 수 있다.구조체는 value 타입이기 때문에 앱의 상태를 고려할 필요가 없다.Objective-C 와의 상호작용이 필요할 때는 클래스를 사용하라.데이터를 처리해야 하는 Objective-C API를 사용하거나 프레임워크에 정의된 기존 클래스 계층에 맞춰야 하는 경..