IOS
SwiftUI NavigationView BackButton Custom
NavigationView에서 BackButton을 그냥 주황색 화살표 하나만 남기고 싶었는데.. 그 정보를 찾는게 왜이렇게 어렵지?? import SwiftUI @main struct DiaryApp: App { init() { let image = UIImage(systemName: "arrow.left") UINavigationBar.appearance().backIndicatorImage = image UINavigationBar.appearance().backIndicatorTransitionMaskImage = image //이건 작동 안하는 듯... // UINavigationBar.appearance().barTintColor = .orange //네비게이션 타이틀 텍스트 색상 검정색 적용..
SwiftUI 에서 UIKit 사용하기
UIKit View를 SwiftUI 에서 사용하기 UIViewRepresetable 프로토콜 구현하여 View 구현체 작성 makeUIView, updateUIView 메소드를 구현 해준다. struct SampleUILabel: UIViewRepresentable { @Binding var text: String func makeUIView(context: Context) -> UILabel { let label = UILabel() label.textColor = .black return label } func updateUIView(_ uiView: UILabel, context: Context) { uiView.text = text } } SwiftUI의 프로퍼티 래퍼인 @Binding 등을 사용..
NSCollectionLayoutDimension 알아보기
UICollectionView 에서 UICollectionViewCompositionalLayout 구성시 사용하는 dimension 정보 NSCollectionLayoutDimension.absolute 정확한 크기를 명시한다. 정해진 수대로 크기가 정해진다. NSCollectionLayoutDimension.fractional 아이템을 감싸는 컨테이너의 크기에 대한 비율 값을 사용한다. 0.2 를 준다면 해당 item Continer 의 1/5 크기로 정해진다. NSCollectionLayoutDimension.estimated 런타임에 크기가 변경될 여지가 있는 경우에 사용한다. 시스템의 폰트 크기가 변경되는 경우에 itemSize가 변경되는 것이 고려된 dimension 이다. 시스템이 런타임에 ..
UIKit UIView 의 Frame 과 Bounds
CGRect CGRect 는 x, y 좌표(origin)와 width, height 인 크기(size)를 가진다. UIView 는 CGRect라는 오브젝트를 frame 과 bounds 라는 변수를 통해 가지고 있다. frame frame 의 x, y 좌표는 부모 뷰(super view)의 원점(0, 0) 을 기준으로 좌표가 측정 되어진다. frame 의 width, height 는 해당 뷰 전체를 감쌀 수 있는 사각형의 크기 이다. 200*200의 사각형이 기울어져 있다면, 기울어진 사각형을 포함하기 위해 frame.width, height는 더 크게 측정된다. bounds bounds 의 x, y 좌표는 자신 스스로의 좌표로, 최초 생성시에는 0, 0 으로 초기화 된다. bounds 의 사이즈는 실제 ..
Swift 접근 한정자
모듈 모듈이란 코드를 배포하는 단일 단위로, 프레임워크나 앱이 이 단위로 배포된다. xcode 에서 각 빌드 타겟은 별도 모듈로 취급 된다. open 소속 모듈, 모듈 외부에서도 접근 가능하다. 다른 모듈에서 오버라이딩 및 상속이 가능하다. public open 과 같이 접근 가능하지만, 소속 모듈이 아닌 곳에서 오버라이딩이 및 상속이 불가능 하다. internal 접근 한정자가 지정되지 않는 경우 디폴트로 지정되는 한정자 이다. 소속 모듈에서는 모두 사용할 수 있지만, 모듈 외부에서는 접근할 수 없다. fileprivate 소속 소스 파일 내에서만 접근 가능하다. private 현재 소스를 둘러싸는 선언에서만 접근 가능하다.
스위프트 Attributes
@Escaping (Escaping Closure) 함수의 파라미터로 받는 클로저가 함수 외부에서 실행 되는 경우 달아준다. func asdf(closure: @escaping () -> Void) { asyncMethod(callBack: closure()) } asdf메소드 실행시 내부 async의 콜백으로 클로저가 주어지고, asdf는 즉시 종료되기 때문에 escaping closure가 아닌경우 asdf 메소드 종료와 함께 소멸되므로, escaping 처리가 필요하다. @dynamicCallable class, struct, enum, protocol 에 붙힐 수 있으며, 내부 구현 함수를 즉시 실행 하도록 사용 가능하다. 해당 타입은 dynamicallyCall(withArguments:) 또는..
스위프트 Generic
함수 선언시 제네릭 func swap(left: inout T, right: inout T) { let tempLeft = left left = right right = tempLeft } var left = 1 var right = 2 swap(&left, &right) 구조체 및 클래스 선언시 제네릭 struct Stack { let items: [T] = [] } let stack: Stack = Stack() 제네릭 타입 제약 func isSame(a: T, b: T) -> Bool { return a == b } Equatable 프로토콜을 준수하는 인스턴스만 T파라미터로 받을 수 있다. T: class명 으로 주면 해당 클래스 혹은 클래스를 상속한 클래스만 올 수 있다. 제네릭 확장 exten..
스위프트 Property Wrapper
@State 뷰 내부에서 상태를 나타내도록 사용하기 때문에 보통 private 으로 선언 한다. State가 변하면 뷰는 항상 최신 상태를 유지한다(State와 엮여있는 뷰가 다시 랜더링 된다) struct SampleView: View { @State private var text: String = "" VStack { TextField("텍스트 입력: ", text: $text) Text(text) } ... } TextField로 사용자에게 텍스트를 입력받고, 해당 텍스트를 text변수에 할당한다. Text는 State인 text를 사용하므로 text변수의 값이 변경 될 때마다 랜더링 된다. @Binding 하위 뷰에서 상위 뷰의 @State 에 접근 하기 위해 사용 한다. 상위 뷰의 @State ..
스위프트 키워드
class Person { var name: String var age: Int init(name: String ,age: Int) { self.name = name self.age = age } convenience init(name: String) { self.init(name: name, age: 30) } } is, as (타입캐스팅) is 서브 클래스인지 확인 하는 연산자로, bool 을 리턴한다. let test: Character = "A" test is Character // true test is String // false as 업캐//스팅 혹은 다운캐스팅 시에 사용한다. //업캐스팅 let human = Teacher.init() as Human // 상위 클래스인 Human 타입으로..
스위프트 Optional
Swift Optional 스위프트는 기본 변수에 null(nil)을 허용하지 않는다. 따라서 nil 변수 선언시 강제로 Optional 으로 래핑한다. 옵셔널 선언시 ? 를 사용한다. let age: Int? 옵셔널 된 값을 강제 언래핑 시킬때 ! 를 사용한다. age! if문에서 optional 을 즉시 사용할 수 있다. var age: Int? age = 10 if let myValue = age { //age optional 변수에 값이 할당 되어 있을 때 해당 if문이 실행되고, //언래핑 된 값을 myValue 로 사용할 수 있다. } else { //optional 에 값이 할당 되지 않았다면 else 문이 수행된다. print("optional value is nil!") } 여러개의 옵셔..