전체 글 93

네비게이션 바에 배경 색상 넣기....

아래 처럼 나와야 하는데.. 이거 하느라 엄청 뻘짓했다.. 아래 보면 스크롤하면 글자가 작아지고 커지고하면서 배경색이 그대로지만 func setupNavigationTitle() { self.navigationItem.title = "Home Controller" let appearance = UINavigationBarAppearance() appearance.backgroundColor = .systemIndigo navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearance /* 그냥 navigationBar.barT..

iOS/UIKIT 2024.02.20

클로저 6편

@escaping 지금까지 써온 클로저는 다음과 같이 "non-escaping Closure" 임 func runFuntion(closure: (Int, Int) -> Int) { closure(1,2) } ※ non-escaping Closure 란? 함수 내부에서 직접 실행하기 위해서 사용 파라미터로 받은 클로저를 변수 또는 상수에 대입 불가 중첩 함수에서 클로저를 사용할 경우 중첩 함수 리턴 불가 함수의 실행 흐름에서 탈출 안되기 때문에 함수가 종료되기 전에 무조건 실행되어야 함 만약에 상수에 클로저를 대입하면? func runFuntion(closure: (Int, Int) -> Int) { let answer: (Int, Int) -> Int = closure } 아래와 같이 오류가 발생 함수의..

iOS/Swift 2024.02.17

클로저 5편

@autoclosure 파라미터로 전달된 일반 구문 & 함수를 클로저로 래핑(Wrapping)하는 것을 말함 "@autoclosure" 라는 키워드를 파라미터 함수 타입 앞에 사용 func runFunction(closure: @autoclosure ()->()) { // 내부코드 } 여기서 closure 라는 파라미터는 실제로 클로저를 받지 않았지만, 클로저처럼 사용 가능 ※ 단, 실제 클로저를 전달받지 않았기 때문에 파라미터로 값을 넘기는 것 처럼 ( ) 를 통해 구문을 넘기는게 가능 runFunction(closure: 22>=23) " 22>=23" 은 일반 구문이지만, 실제로는 @autoclosure로 설정했기 때문에 클로저처럼 사용 가능 @autoclosure는 클로저가 호출되기 전까지 클로저..

iOS/Swift 2024.02.13

클로저 4편

클로저의 경량 문법 클로저의 문법을 단순하게 쓸 수 있게 하는 문법 func runFuntion(closure: (Int, Int) -> Int) { closure(1,2) } 위의 함수는 파라미터로 받은 클로저를 실행 클로저의 파라미터로 Int 타입의 1, 2를 전달 위의 함수를 호출하려면? 아래와 같이 클로저를 완전체로 작성해야함 runFuntion(closure: { (value1: Int, value2: Int) -> Int in return value1 + value2 }) 파라미터 타입과 리턴 타입 생략 가능 위의 함수에서 파라미터 타입 (Int, Int) 와 리턴 타입 Int 생략 가능 runFuntion(closure: { (value1, value2) in return value1 + v..

iOS/Swift 2024.02.10

클로저 3편

트레일링 클로저 트레일링 클로저는 클로저의 경량문법 즉, 클로저를 좀 더 보기 편하게 도와주는 문법 함수의 마지막 파라미터가 클로저일 때 이를 파라미터 값 형식이 아닌 함수 뒤에 붙여 작성하는 문법으로 이 때, Argument Label은 생략 파라미터가 클로저 하나인 함수 func runSomething(closure: () -> ()) { closure() } 해당 함수를 호출하는 방법 runSomething(closure: { () -> () in print("Hello")}) 위의 방식을 Inline Closure 라고 함 클로저가 파라미터의 값으로 함수 ( ) 안에 작성되어 있는 것을 말함 이 때 함수 구문 뒷 부분에 ")})" 이런식으로 되어 있는게 코드를 작성할 때 실수할 수 도 있고, 보기..

iOS/Swift 2024.02.10

클로저 2편

클로저는 다음 2개를 말함 Named Closure func someFunc { print("Named Closure") } Named Closure는 그냥 함수라고 부름 Unnamed Closure let someClosure = { print("Unnamed Closure") } 이름을 붙이지 않고 사용하는 함수 = 클로저 클로저는 Named Closure & Unnamed Closure 둘 다 의미하지만, 보통은 Unnamed Closure라고 지칭함 ★ 클로저는 함수이기 때문에 1급 객체 함수의 특성 갖고 있음 ★ 클로저 표현식 키워드 "in"을 기준으로 전은 Closure Head 라고 부르고, 후는 Closure Body 라고 부름 { (Parameters) -> Return Type in 실..

iOS/Swift 2024.02.08

클로저 1편

클로저란? 스위프트의 함수 정의 구문에서 목적에 따라 불필요한 부분을 제거 최대한 단순한 형태로 일회용 함수 역할을 하기 위한 객체 아래 코드에서 animations 매개변수로 exec의 함수를 받음 근데 exec라는 함수는 한 번만 사용되는 일회용 함수임 UIView.animate(withDuration: TimeInterval(0.15), animations: exec) 이와 같이 일회용 함수를 매번 만들기 귀찮기 때문에 animations의 타입과 동일한 경우라면 exec 함수 대신 클로저를 넣음 클로저 만들기 func add(value1: Int, value2: Int) -> Int { let result = value1 + value2 return result } 이미 함수라는 것을 알고 있기 ..

iOS/Swift 2024.02.06

접근제어

접근제어 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능 접근제어의 필요성 캡슐화와 은닉화를 구현하는 이유는 외부에서 보거나 접근하면 안 되는 코드가 있기 때문 모듈과 소스파일 모듈은 배포할 코드의 묶음 단위 소스파일은 하나의 스위프트 소스 코드 파일 의미 접근수준 키워드 open public internal fileprivate private 접근수준 키워드를 통해 각 타입 (클래스, 구조체, 열거형 등)에 접근 수준 지정 가능 또는 타입 내부의 프로퍼티, 메서드. 이니셜라이저 등에도 접근 수준 지정 가능 공개 접근수준 => public public 키워드로 접근수준이 지정된 요소는 어디서든 사용 가능 파일의 내부는 물론 외부에서도 지정된 요소에 접근 가능 개방 접근수준..

iOS/Swift 2024.02.05

탭 제스처 + 사진 선택

먼저 피커뷰 델리게이트 설정 //MARK: - 피커뷰 델리게이트 설정 extension DetailViewController: PHPickerViewControllerDelegate { // 사진이 선택이 된 후에 호출되는 메서드 func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { // 피커뷰 dismiss picker.dismiss(animated: true) let itemProvider = results.first?.itemProvider if let itemProvider = itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self..

iOS/UIKIT 2024.02.02

인스턴스 생성 및 소멸 6편 (인스턴스 소멸)

인스턴스 소멸 클래스의 인스턴스가 메모리에서 해제(소멸) 되기 직전에 호출 되는 메소드가 디이니셜라이저 "deinit" 키워드 사용 ★ 디이니셜라이저는 클래스의 인스턴스에서만 구현 ★ 스위프트에서는 인스턴스가 필요하지 않는다면 자동으로 소멸시킴 이 때 디이니셜라이저를 통해 별도로 전달할 내용이나, 저장해야 하거나 할 경우, 부가 작업을 지정해줄 수 있음 클래스에는 디이니셜라이저를 1개만 구현 가능 매개변수를 갖지 않고 소괄호도 적어주지 않음 디이니셜라이저 구현 class SomeClass { deinit { print("deinit") } } var someInstance: SomeClass? = SomeClass() someInstance = nil // deinit

iOS/Swift 2024.02.02