일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Clean Code
- rxswift
- 스위프트
- 리펙터링
- RxCocoa
- 리펙토링
- uitableview
- combine
- clean architecture
- ios
- Protocol
- Human interface guide
- map
- 리팩토링
- swift documentation
- collectionview
- tableView
- 클린 코드
- Refactoring
- HIG
- Xcode
- 애니메이션
- UICollectionView
- uiscrollview
- Observable
- ribs
- SWIFT
- MVVM
- swiftUI
- UITextView
- Today
- Total
목록분류 전체보기 (1643)
김종권의 iOS 앱 개발 알아가기
swiftlint와 swift-foramt 차이 swiftlint는 코드 스타일을 검사하여 .yml파일에 개발자가 미리 정의한 규칙을 사용하여 스타일을 준수하지 못하면 warning이나 error를 보여주는 것 구체적인 swiftlint 사용 방법은 이전 포스팅 글 참고 swift-format은 warning, error를 보여주지 않고, 특정 명령어를 수행하면 자동으로 코드가 포멧팅되는 것 즉, 개발할 때 에러가 나거나 warning을 보여지게 하고싶다면 swiftlint를 사용하고, 자동으로 코드를 포멧팅 시켜주려면 swift-fotmat을 사용 swift-foramt 사용 방법 설치 $ brew install swift-format Xcode를 여고 포멧팅이 필요한 코드를 준비 someFunc 함수..
guard문을 사용하여 과도한 들여쓰기 막기 guard문은 다른 언어에 거의 없고 swift언어에만 있는 문법 guard문의 의미는 코드의 흐름에서 막아야 하는 조건이라는 의미 guard를 사용하면 과도한 들여쓰기를 막고 읽기 쉽게 표현이 가능 ex) guard문 쓰기 전 func processUserInput(_ input: String?) { if let unwrappedInput = input { if unwrappedInput.count > 0 { if let intValue = Int(unwrappedInput) { if intValue >= 0 { print("입력한 값 > 양수") } else { print("입력한 값 > 음수") } } else { print("입력한 값 > 정수 x") ..
setContentOffset 개념 UIScrollView의 메서드이며, CGPoint 좌표를 통해 원하는 곳으로 스크롤 하게끔하는 기능 애플에서는 이 메서드에 completion handler를 따로 작성하지 않아 직접 구현이 필요 completion 구현하는 방법에는 UIView.animate와 CATransaction 등등의 방법이 널리 알려져 있지만 이 방법으로는 completion 동작 x setContentOffset에 completion 구현 방법 "contentOffsetAnimationDuration"를 사용하여 UIScrollView의 인스턴스에 setValue로 입력하면 스크롤 속도를 지정할 수 있는 아이디어를 사용 scrollView.setValue(0.5, forKeyPath: "..
UITextView의 Cursor 개념 Cursor는 사용자 편의를 위해서 현재 수정되거나 작성될 곳의 위치를 나타내는 역할 애플에서는 이 Cursor도 코드로 이동시키거나 Cursor의 위치를 파악할 수 있도록 NSRange 형태로 제공 NSRange 개념은 이전 포스팅 글 참고 NSRange 요약 개념 NSRange는 _NSRange의 Typealias로 되어 있고 범위의 시작 위치를 location, 길이를 length 프로퍼티로 표현 public struct _NSRange : @unchecked Sendable { public init() public init(location: Int, length: Int) public var location: Int public var length: Int ..
NSRange 개념 연속된 것 중 한 부분을 나타내는 개념 NSRange는 _NSRange의 별칭 location과 length 2가지의 stored property만 있으면 연속된 것 중 한 부분을 나타낼 수 있음 location: 연속된 길이 중 한 지점 length: 길이 public struct _NSRange : @unchecked Sendable { public init() public init(location: Int, length: Int) public var location: Int public var length: Int } extension으로 여러가지 프로퍼티와 메서드도 제공 주로 범위를 비교할 때 사용하는 연산자 @available(macOS 10.10, iOS 8.0, watch..
복잡한 조건문 보통 복잡한 조건문은 코드의 깊이가 길어지는 형태 ex) 아래처럼 맨 처음 깊이는 if-else이며, if문 하위에 또다른 if-else가 있고, else하위에 if-else가 있어서 총 깊이가 3개짜리인 조건문 let isUserLoggedIn = true let hasSubscription = false let isContentAvailable = true if isUserLoggedIn { if hasSubscription { print("사용자가 로그인하고 구독이 활성화되어 있습니다.") } else { if isContentAvailable { print("사용자가 로그인했지만 구독이 없습니다. 콘텐츠를 사용할 수 있습니다.") } else { print("사용자가 로그인했지만 구..
Protocol 프로퍼티 치환 일반적으로 protocol에서 프로퍼티를 선언하면, 이 프로토콜을 준수하는 쪽에서 똑같은 프로퍼티 이름으로만 접근이 가능 protocol SomeProtocol { var myProperty: Int { get } } struct SomeStruct: SomeProtocol { var myProperty: Int } 만약 프로퍼티 이름이 다르면 컴파일 에러 발생) @_implements를 사용하면 다른 이름으로 사용이 가능 @_implements 키워드 @_implements(ProtocolName, propertyName)으로 프로퍼티 위에 선언하여 사용 struct SomeStruct2: SomeProtocol { @_implements(SomeProtocol, myPr..
Zero Width Space "\u{200B}" 문자는 "zero width space"라고 불리며, 문자열은 있지만 너비의 크기가 0인 문자 ex) 두 개의 UITextField에 placeholder 텍스트를 지정하고, text 값에는 각각 ""와 "\u{200B}"를 입력한 상태 private let textField1 = { let textField = UITextField() textField.font = .systemFont(ofSize: 24, weight: .regular) textField.text = "" textField.textColor = .black textField.placeholder = "placeholder (empty spacing)" return textField..