일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리펙터링
- UICollectionView
- UITextView
- uiscrollview
- collectionview
- Refactoring
- 리팩토링
- clean architecture
- swift documentation
- combine
- rxswift
- ribs
- RxCocoa
- uitableview
- Protocol
- Xcode
- MVVM
- 리펙토링
- HIG
- Clean Code
- Observable
- map
- ios
- 클린 코드
- swiftUI
- Human interface guide
- 스위프트
- tableView
- 애니메이션
- SWIFT
- Today
- Total
목록SWIFT (948)
김종권의 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..
1. noncopyable, ~Copyable - 개념 (Swift 5.9+, owner, ownership, 최적화)2. noncopyable, ~Copyable - 연산자 (borrowing, inout, consuming)~Copyable 연산자~Copyable을 사용하고 이 instance를 함수에서 주고 받을 때, 파라미터에 아무런 키워드를 사용하지 않으면 컴파일 에러가 발생struct A: ~Copyable { var age: Int deinit { print("deinit: A") }}class ViewController: UIViewController { var a = A(age: 1) override func viewDidLoad() ..
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..
@State, @Bindable 이란?@State 개념양방향 바인딩 (프로퍼티 뷰)@State는 Property wrapper로 구현되었으며 뷰의 상태를 표시해줄 목적으로 있는 키워드이 키워드로 프로퍼티를 선언하고 이 키워드를 뷰에 입력해주면, 이 프로퍼티가 변경되면 자동으로 뷰도 변경됨ex) string이라는 프로퍼티를 @State로 선언하고, 이 프로퍼티를 Text(string)으로 Text 뷰에 넣어준 후, string 프로퍼티 값을 변경해주면 자동으로 Text뷰에 반영됨import SwiftUIstruct ContentView: View { @State var string = "..." var body: some View { VStac..
딕셔너리에서의 디폴트 값딕셔너리 인스턴스의 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 ..