일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- clean architecture
- ribs
- scrollview
- uiscrollview
- swiftUI
- tableView
- Xcode
- Protocol
- UITextView
- SWIFT
- rxswift
- Human interface guide
- 리펙토링
- map
- HIG
- 애니메이션
- Observable
- 리팩토링
- combine
- MVVM
- UICollectionView
- uitableview
- RxCocoa
- collectionview
- swift documentation
- 스위프트
- Clean Code
- Refactoring
- ios
- 클린 코드
- Today
- Total
목록전체 글 (1651)
김종권의 iOS 앱 개발 알아가기

문자열 bullet 기준 들여쓰기 UIbullet기준으로 텍스트들이 들여쓰기 되어있는 UI폰트가 큰 경우에도 들여쓰기 기준 동일)let text = """• 첫 번째 텍스트 이빈다. 이것은 bullet 테스트, 과연 긴 텍스트가 있을 때 indent가 어떻게 적용될 것인가 테스트 해봅니다. iOS 앱 블로그 알아가기 jake에서 살펴봅니다.• 두 번째 텍스트 입니다."""문자열 bullet 기준 들여쓰기 구현 아이디어뷰와 UILabel 준비import UIKitclass ViewController: UIViewController { private let label = { let l = UILabel() l.font = .systemFont(ofSize: 30) ..

UITableView 데이터 추가하기UITableView에서 스크롤하면서 동시에 아래에 데이터를 계속해서 추가해주어야하는 페이지네이션 UI가 존재페이지네이션 UI 구현 방법은 이전 포스팅 글 참고 [iOS - swift] UITableView 하단 로딩 구현 방법 (#페이지네이션, footer loading, UIActivityIndicatorView)하단 로딩 구현 아이디어1단계) Pagination: tableView의 willDisplay 델리게이트에서 마지막 인덱스 값인지 체크하고, 마지막 인덱스 값이면 페이지네이션 구현2단계) 하단로딩: willDisplay에서 페이지네이ios-development.tistory.comex) 페이징 관련 코드마지막 셀이 보여질 때 로딩 뷰, footerView를..
struct, class 메모리 저장 위치strucrt는 보통 메모리에서 stack영역에, class는 heap영역이 저장되는데, 아래처럼 struct안에 class 타입이 있을때 이것은 어디에 저장될 것인가?class SomeClass { var value: Int init(value: Int) { self.value = value }}struct SomeStruct { var classInstance: SomeClass var otherValue: Int}결론은 SomeStruct는 stack영역에 저장되고, SomeStruct의 class타입인 프로퍼티 classInstance는 heap영역에 저장됨메모리 위치 알아내기swift에서 heap과 stack영역의 ..
결합 연산자2차원 배열을 1차원 배열로 만들 때, 3가지의 연산자 사용이 가능var a = [[1, 2], [3], [4, 5]]let a_1 = a.flatMap { $0 }let a_2 = a.reduce([], +)let a_3 = Array(a.joined())// [1, 2, 3, 4, 5]하지만 여기서 reduce 연산자를 사용하면 O(n^2)의 비용이 들고 flatMap, joined를 사용하면 O(n) 비용이 들기때문에 reduce를 지양할 것reduce를 사용했을때 O(n^2) 비용이 드는 이유3*3 배열일때 예시var b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]초기 상태 = []첫번째 배열 순회하면서 append: [[1, 2, 3]]누적 연산 카운트: 3두번째 ..
* Synthetic Sugar: 결과는 같지만, 코드를 조금 더 단순하게 표현하는 것Optional 타입에 map 사용하기보통 map 함수를 배열과 같은곳에 원소를 하나씩 돌면서 변화를 줄 때 사용let items = [1,2,3,4,5]let itemsWithPlusOne = items.map { $0 + 1 }하지만 Optional 타입에도 map을 사용이 가능Swift 코드를 보면 Optional에 map 함수가 정의Optional인 타입의 메소드이며, 이 map을 사용하면 Optional을 벗겨낸 값을 map의 클로저로 전달한 인수로 들어가는 것@frozen public enum Optional : ExpressibleByNilLiteral { @inlinable public func ma..

그라데이션 주는 방법Swift에서 그라데이션을 주려면 뷰의 layer에 CAGradientLayer을 추가하여 적용 필요때문에 그라데이션 효과를 주는 CAGradientLayer와 이것을 UIView가 필요let gradationView = UIView()let gradientLayer = CAGradientLayer()gradientView.layer.addSublayer(gradientLayer)또 layoutSubviews와 같은 화면의 크기가 결정되었을때 호출되는 시점에 gradientLayer의 frame 업데이트가 필요override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() gradientLayer.frame = g..
@State를 사용하면 mutating 없이도 사용이 가능아래처럼 @State를 프로퍼티에 붙여서 사용하면 change()함수에서 mutating 키워드가 없더라도 문제없이 동작struct MyStruct { @State var val = 0 func change() { val = 0 }}struct이기 때문에 값을 변경하려면 원래 mutating키워드가 필요하지만 @State를 사용하면 mutating 없이 사용이 가능struct MyStruct { var a1 = 0 func change() { a1 = 2 // Cannot assign to property: 'self' is immutable }}computed property..
셀이 탭 되었을때 애니메이션 넣는 방법터치 이벤트는 tableView의 Delegate 메서드인 didSelectRowAt에서 받을 수 있는데, 여기서 특정 셀을 캐스팅해서 터치 애니메이션 실행이 가능(애니메이션은 셀이 탭 되었을때 셀이 가지고 있는 메서드를 실행시키고, 셀 안에서 UIView.animate로 애니메이션처리)(애니메이션 적용은 쉽기 때문에 이 포스팅 글에서는 생략)func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at: indexPath) as? CustomCellType1 cell?.didTapCell()}하지만 이렇게하면 확장..