일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- tableView
- map
- collectionview
- UICollectionView
- ribs
- RxCocoa
- Protocol
- rxswift
- UITextView
- clean architecture
- Clean Code
- 클린 코드
- Xcode
- uiscrollview
- 리펙터링
- 리팩토링
- swift documentation
- 리펙토링
- swiftUI
- SWIFT
- ios
- combine
- MVVM
- Observable
- Refactoring
- 애니메이션
- Human interface guide
- 스위프트
- uitableview
- HIG
- Today
- Total
목록분류 전체보기 (1547)
김종권의 iOS 앱 개발 알아가기
layoutIfNeeded() 레이아웃 시스템을 업데이트하고 뷰의 크기와 위치를 조정 subview의 레이아웃을 즉시 업데이트 layoutIfNeeded() 동작 원리 a.layoutIfNeeded() 위와같이 호출하는 경우 뷰의 레이아웃 업데이트 범위? a뷰는 업데이트 안됨 a의 subview들만 업데이트됨 (공식 문서에서도 subviews들을 업데이트 한다고 명시) 주의사항 a뷰가 b뷰를 가지고 있을때, a.layoutIfNeeded()를 호출하면 b.layoutIfNeeded()가 호출되지 않음 a.layoutIfNeeded()를 호출해서 a뷰의 레이아웃이 업데이트되고 b입장에서 a뷰의 레이아웃이 업데이트 되었으므로 자동으로 업데이트 되는 것 autolayout 사용할 경우 superview에 따라..
Autolayout 동작 방식 Autolayout은 superview의 크기가 변경되면, constraints로 잡혀있는 값을 기준으로 본인의 크기를 적절하게 변화시키는 것 ex) 사용자가 iPhone을 회전하는 경우, superview인 window의 가로와 세로가 변경되므로 그 subview들은 모두 크기를 변화시킴 constraints로 위치와 크기에 관한 (x, y, width, height) 기준이 정해지면, superview가 변할때 언제든지 동적으로 변동이 가능 Autoresizing Mask 개념 bit mask를 사용 * bit mask: 2진수로 표현한 값이며, 0001은 width값, 0011은 height값 이렇게 값을 표현하는 방법 (enum형태) ex) 아래는 flexibleWi..
Type casting 일반적인 표현 String -> Double 가장 일반적인 방법 Double에 문자열을 집어넣는 방법 Double("1") 또는 extension String에 넣는 방법 extension String { var asDouble: Double? { Double(self) } } "1".asDouble Type casting 표현식 표현식을 정의해놓는 방법 let stringToDouble = Double.init as (String) -> Double? 동작 1) 인수가 (String)으로 삽입 2) 인수가 Double.init에 들어감 - Double(인수)형태로 초기화 3) 그 값을 리턴 print(stringToDouble("a")) // Optiona(nil) print(s..
Optional Property 연산 Optional 타입인 프로퍼티가 있을때 여기에 특정 값을 더하거나, 빼거나 연산을 하고 싶은 경우 보통 아래처럼 작성 Optional binding을 시도한 후 값이 있는 경우에 10을 새로 더하는 방식 var intValue: Int? = 10 func addTen() { if let intValue { self.intValue = intValue + 10 } } 프로퍼티에 ? 를 사용하면 더욱 편리하기 표현이 가능 func addTen() { intValue? += 10 } 번외 - 조건문에서 사용 Optional타입은 enum으로 정의되어 있고 .some으로 접근하면 바로 optional binding가 가능 let optionalString = Optiona..
any와 some 키워드 any와 some키워드는 type erase 방법 type erase: 코드의 추상화를 위해서 구체적인 타입을 지우는 것 3가지 메소드의 차이점? 3가지 모두 런타임에 타입이 결정되므로 dynamic dispatch로 동작 f2는 any를 붙여줌으로써 프로토콜을 사용하면 dynamic dispatch가 될것이라는 것을 명시적으로 표현했고 Swift6.0부터는 any키워드를 붙이지 않으면 컴파일 에러가 나게 변경 예정 (참고) f3도 원래는 사용하던 시점이 있었지만 any가 등장하면서 some을 any로 써도 무방하게끔 변경됨 (참고) protocol P {} func f1(p: P) { } func f2(p: any P) { } func f3(p: some P) { } any와 ..
* 추상화하기 목차: https://ios-development.tistory.com/1627 프로토콜과 제네릭스 사용하는 목적 파악하기 프로토콜 사용 목적? protocol을 타입(existential type)으로하고 구현체를 assign하는 패턴으로하면 구현체의 변경할 때 유연성이 증가 구현체에는 여러 구현 코드가 섞여서 정말 사용하는쪽에서만 필요한 인터페이스만 보려면 가독성이 떨어지지만 protocol을 타입으로한다면 사용하는 쪽에서 필요한 스펙 파악이 용이 제네릭스 사용 목적 코드의 재사용성 중복 제거 포로토콜에 제네릭스 사용의 이해 프로토콜에는 associated type 키워드를 사용하여 제네릭스 사용이 가능 ex) cell타입을 추상화하기 위해서 protocol을 사용했고 이 proto..
* 추상화하기 목차: https://ios-development.tistory.com/1627 제네릭스의 목표 공통화, 추상화, 코드의 유연성 구체적인 내용은 이전 포스팅 글 참고 제네릭스 훑어보기 - 함수에 적용 함수에 적용 - 함수 이름 오른쪽에 꺽쇠를 사용하여 타입 표현 before) func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a a = b b = temporaryA } func swapTwoDoubles(_ a: inout Double, _..
Existential Type 개념 * Existential: "존재하는" Existential Type는 protocol를 명시적으로 타입을 지정하는 경우, 그 protocol을 Existential Type이라고 명칭 ex) 아래 SomeProtocol을 Existential Type이라고 명칭 let instance: SomeProtocol = SomeClass() Existential Any 개념 Existential Type을 사용할 때, dynamic dispatch가 일어나고 적지않은 메모리 할당 등 비용이 비싼 단점이 존재하여 프로그래머에게 Existential Type을 사용할땐 주의하게끔 any 키워드를 붙여서 사용하라는 의미 (비용관련 내용) (any 키워드를 붙여야 하는 이유 - 실..