일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ios
- Human interface guide
- uitableview
- 애니메이션
- tableView
- 리펙토링
- map
- HIG
- combine
- Observable
- Refactoring
- rxswift
- Clean Code
- UICollectionView
- swiftUI
- clean architecture
- 리펙터링
- ribs
- swift documentation
- SWIFT
- collectionview
- Xcode
- 클린 코드
- RxCocoa
- uiscrollview
- MVVM
- 리팩토링
- UITextView
- 스위프트
- Protocol
- Today
- Total
목록iOS 응용 (swift) (722)
김종권의 iOS 앱 개발 알아가기
콘페티 효과콘페티 효과를 구현하려면 CAEmitterCell과 CAEmitterLayer를 사용하여 구현폭죽 효과눈 효과 CAEmitterCell, CAEmitterLayer 개념CAEmitterCell을 CAEmitterLayer에 추가하고, layer에서 위치를 정한다음 view.layer.addSublayer에 추가하여 구현CAEmitterCell로 파티클에 들어갈 하나하나의 요소의 속성값을 정하고, CAEmitterLayer에 이 emitterCell을 주입해주는 것let emitterCell = (CAEmitterCell 인스턴스)let emitterLayer = CAEmitterLayer()emitterLayer.emitterPosition = CGPoint(x: view.bounds.midX..
Saturation (채도)가끔 dimmed 효과를 주기 위해서 일반 이미지에 CIFilter를 사용하여 채도를 낮추는 코드(하지만 iOS 17에서 위젯 관련 버그가 존재)ex) CIFilter를 활용한 채도를 변화시키는 메소드// 출처: https://stackoverflow.com/questions/62040870/how-can-we-decrease-saturation-of-uiview-in-swiftextension UIImage { func withSaturationAdjustment(byVal: CGFloat) -> UIImage { guard let cgImage = self.cgImage else { return self } guard let filter = C..
1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화)2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming)noncopyable, ~Copyable 이란?Swift5.9에서 탄생struct SomeStruct: ~Copyable { var name: String}enum SomeEnum: ~Copyable { case a}swift5.9 이전 swift 모든 타입들은 모두 copyable 타입 noncopyable은 swift5.9에서 enum과 struct에 적용 가능하도록 등장class 타입은 deinit이 있어서 이 deinit을 활용할 수 있지만, struct와 enu..
consume 개념swift5.9+"consume" 의미 그대로 lifetime을 중지한다는 의미a라는 프로퍼티를 consume 시키면사용하지 못함 (컴파일 에러 발생)var a = [1,2,3]var b = consume aprint(a) // 'a' used after consume프로퍼티를 copy하거나 write할때 최적화하기 위해 consume이 탄생일반적으로 CoW라고 명칭데이터를 복사하는 대신에 필요한 시점에서만 복사를 하기 때문에 메모리를 효율적으로 사용주로 대용량 데이터나 공유 자원을 다룰 때 유용ex) CoW 개념var b = a를 시도할때, b는 a의 데이터를 참조하고 있다가, 만약 b의 수정사항이 될땐 (b = 1), b가 자체 복사본을 만들어서 1의 값으로 변경하는 것메모리를 효..
1. 클로저를 사용할 때 주의할 점 - Memory Leaks, Retain Cycle, nested closure 첫 번째2. 클로저를 사용할 때 주의할 점 - nested closure 두 번째3. 클로저를 사용할 때 주의할 점 - nested closure 세 번째nested closure에서의 memory leak첫 번째 글에서 알아보았듯이, nest closure가 있을 때 외부 클로저가 아닌 내부 클로저에서 [weak self]를 잡게되면 메모리 릭이 발생// retain cycleclass Jake3 { let name = "Jake3" var closure: (() -> ())? var closure2: (() -> ())? init() { let ..
@Sendable 개념Sendable이라는 의미는 "전달 할 수 있는"이라는 의미이지만, 생략된 의미가 존재@Sendable는 불변성을 보장하는 "전달 할 수 있는"의 의미로 사용동시성 프로그래밍에서 핵심은 프로퍼티들의 '불변성'을 유지하는 것프로퍼티들이 '불변성'을 만족한다면, 동시성 프로그래밍에서 쉽게 파라미터, 클로저 등에 넘겨서 처리하는 것에 race condition, dead lock, memory conflict 등의 문제등을 신경쓰지 않고 편하게 프로그래밍이 가능@Sendable의 목적은 값을 변경할 수 없도록 강제화하는것예제특정 closure가 있을 때 이 closure에서는 전역변수인 age값 수정이 가능class ViewController: UIViewController { va..
딕셔너리에서의 디폴트 값딕셔너리 인스턴스의 value값에 특정 값을 추가하고 싶은 경우, key값이 존재하지 않을 여지가 있기 때문에 아래처럼 컴파일 에러가 발생var dict = ["a": 1, "b": 2]["a", "b", "c"] .forEach { char in dict[char] += 1 // Value of optional type 'Int?' must be unwrapped to a value of type 'Int' }dict에 "c"키값을 새로 만들어서 1 값이 입력되게끔 하고 싶은 경우?아래처럼 nil을 체크하여 구현이 가능하지만 번거로운 형태["a", "b", "c"] .forEach { char in if ..
reduce 연산자reduce 연산자는 배열과 같은 Collection type들을 하나씩 누적하며 하나의 값으로 만드는 연산자reduce(into:_:)와 reduce(_:_:) 두가지가 존재reduce(_:_:)와 reduce(into:_:)reduce(_:_:)연산자배열과 같은 Collection Type을 순회하면서 하나의 값으로 만들어주는 연산자첫번째 인수에는 순회할때 축적되어야 하는 초기값두번째 인수에는 클로저를 주입하는데, 클로저의 첫번째 값은 순회할때마다 추적되고 있는 값이며 두번째 값은 순회하는 값// exlet arr = [1, 2, 3, 4, 5]let val2 = arr.reduce(0) { result, element in result + element}let val1 = a..