-
[14주차] 복습 + 클로저 closureiOS프로그래밍기초 2024. 12. 5. 14:51
1. 다른사람의 앱을 복사는법
1번 뷰 컨트롤러 부터 복사함

컨트롤러 잡고 복사 2번 스위프트 파일작성함 , 뷰컨트롤러말고 당연히 다른 이름으로 작성

3번 뷰컨트롤러의 코드를 복사해서 , 스케치뷰 컨트롤러 파일의 클래스 이름 변경

4번 아이덴티티 인스팩터에서 이전에 있던 컨트롤러를 스케치뷰 컨트롤러 클래스로 변경해줘야함

2. 클로저

시험 매개변수도 없고 리턴값도 없는 인자를
3번쨰 인자로 받고 있음
nil은 디폴트 인자
3. 다른 언어의 클로저 형태
1. Swift
스위프트에서 클로저는 코드 블록을 변수처럼 저장하고 전달할 수 있는 기능입니다.
swift코드 복사// 클로저 정의 let greeting = { (name: String) -> String in return "Hello, \(name)!" } // 클로저 호출 print(greeting("Swift")) // 출력: Hello, Swift! // 클로저를 매개변수로 전달 func performAction(action: () -> Void) { action() } performAction { print("This is a closure in Swift!") }
2. JavaScript
자바스크립트에서는 클로저는 외부 함수의 변수에 접근할 수 있는 내부 함수를 의미합니다.
javascript코드 복사function makeCounter() { let count = 0; // 외부 변수 return function () { count += 1; // 외부 변수에 접근 return count; }; } const counter = makeCounter(); console.log(counter()); // 출력: 1 console.log(counter()); // 출력: 2 console.log(counter()); // 출력: 3
3. Java
Java에서는 클로저를 익명 클래스 또는 람다 표현식으로 구현합니다. 람다는 Java 8부터 도입되었습니다.
java코드 복사import java.util.function.Function; public class ClosureExample { public static void main(String[] args) { int multiplier = 2; // 람다 표현식으로 클로저 구현 Function<Integer, Integer> multiply = (number) -> number * multiplier; System.out.println(multiply.apply(5)); // 출력: 10 } }
비교
- Swift
- 함수와 데이터가 함께 캡슐화됨.
- in 키워드로 명시적인 클로저 구조를 작성.
- JavaScript
- 동적 타입 언어로, 함수 내 함수 형태로 자연스럽게 클로저 구현.
- Java
- 람다와 캡처된 변수로 클로저 기능 제공.
- 외부 변수는 final 또는 실질적으로 final이어야 함.
요약
클로저는 각각의 언어에서 다른 방식으로 표현되지만, 공통적으로 외부 스코프의 변수에 접근 가능하고 이 상태를 유지한다는 점이 특징입니다.
4. 후행 클로저 사용 빈도
OS 개발에서 자주 사용하는 후행 클로저(Trailing Closure)를 사용하는 함수들을 소개하고, 예제를 통해 설명하겠습니다. 사용 빈도가 높은 순으로 정리합니다.
1. UIView.animate
애니메이션을 처리할 때 가장 자주 사용되는 함수입니다.
예제:
swift코드 복사UIView.animate(withDuration: 0.3) { // 후행 클로저로 애니메이션 정의 someView.alpha = 0.5 someView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5) } completion: { finished in // 애니메이션 완료 후 작업 print("Animation finished: \(finished)") }
2. DispatchQueue.async
비동기 작업을 수행하기 위해 사용합니다.
예제:
swift코드 복사DispatchQueue.global().async { // 백그라운드 작업 print("Background work") DispatchQueue.main.async { // 메인 스레드에서 UI 업데이트 print("UI updated on main thread") } }
3. UIViewController.present
뷰 컨트롤러를 표시하는 메서드로, 완료 핸들러를 후행 클로저로 작성합니다.
예제:
swift코드 복사let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default)) present(alert, animated: true) { // 후행 클로저: 알림 표시 완료 후 실행 print("Alert presented") }
4. URLSession.dataTask
네트워킹 작업 시 자주 사용됩니다.
예제:
swift코드 복사let url = URL(string: "https://example.com")! let task = URLSession.shared.dataTask(with: url) { data, response, error in if let error = error { print("Error: \(error.localizedDescription)") return } if let data = data { print("Received data: \(data)") } } task.resume()
5. Array.map
배열의 각 요소를 변환할 때 많이 사용합니다.
예제:
swift코드 복사let numbers = [1, 2, 3, 4, 5] let squares = numbers.map { $0 * $0 } // 후행 클로저 print(squares) // 출력: [1, 4, 9, 16, 25]
6. UIViewPropertyAnimator
애니메이션을 보다 세밀하게 제어할 때 사용됩니다.
예제:
swift코드 복사let animator = UIViewPropertyAnimator(duration: 0.5, curve: .easeInOut) { someView.alpha = 0.0 someView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5) } animator.startAnimation()
7. NotificationCenter.addObserver
Notification을 수신할 때도 클로저를 자주 사용합니다.
예제:
swift코드 복사NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { notification in print("Keyboard will show: \(notification)") }
요약
- UIView.animate - 애니메이션 작업.
- DispatchQueue.async - 비동기 작업.
- UIViewController.present - 뷰 컨트롤러 표시.
- URLSession.dataTask - 네트워크 호출.
- Array.map - 배열 변환.
- UIViewPropertyAnimator - 고급 애니메이션.
- NotificationCenter.addObserver - 알림 수신.
이 함수들은 iOS 개발에서 필수적으로 사용되며, 후행 클로저를 사용하면 가독성을 크게 향상시킬 수 있습니다.
5. 시작
func add(x: Int, y: Int) -> Int { return(x+y) } print(add(x: 10 , y: 20)) // 클로저 생성 1단계 func 와 함수 이름을 지운다 (x: Int, y: Int) -> Int { return(x+y) }func add(x: Int, y: Int) -> Int { return(x+y) } print(add(x: 10 , y: 20)) // 클로저 생성 2단계 { 옮기기 in 쓰기 let add1 = { (x: Int, y: Int) -> Int in return(x+y) } // 호출해보기 print(add1(2,3))6. 클로저에 레이블 써보기 (에러)


7. @@후행 클로저

후행 클로저는 마지막 인자로 클로저를 받을때
밖에 쓰는것
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int { return cal(x, y) }2개의 int 와 하나의 함수를 매개변수로 받는 math 함수
func add(x: Int, y: Int) -> Int { return(x+y) } print(add(x: 10 , y: 20)) // 클로저 생성 2단계 { 옮기기 in 쓰기 let add1 = { (x: Int, y: Int) -> Int in return(x+y) } // 호출해보기 print(add1(2,3)) func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int { return cal(x, y) // add1(10, 20) } print(math(x: 10, y: 20, cal: add1)) // 후행 클로저 스타일 math(x: 10, y: 20) { (x: Int, y: Int) -> Int in return(x+y) }'iOS프로그래밍기초' 카테고리의 다른 글
[13주차] BMI (1) 2024.11.28 [12주차] BMI (0) 2024.11.21 [11주차] BMI 계산 앱 만들기 (0) 2024.11.14 [10주차]Ios 예제 살펴보기2 + bmi 판정 프로그램 제작 (1) 2024.11.07 [9주차] xcode, 시뮬레이터 예제들 (6) 2024.10.31 - Swift