전체 글 165

클로저 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

알림창 안에 맵 넣기

먼저 UIViewController 타입의 "MapAlertViewController" 파일 생성 및 메인 스토리보드의 class로 설정 "MapAlertViewController" 파일 내에 버튼 추가 import UIKit class MapAlertViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 버튼 생성 let alertBtn = UIButton(type: .system) // 버튼 속성 설정 alertBtn.frame = CGRect(x: 0, y: 150, width: 100, height: 30) alertBtn.center.x = self.view.frame.width / 2 aler..

iOS/UIKIT 2024.02.01

인스턴스 생성 및 소멸 5편 (함수를 사용한 프로퍼티 기본값 설정)

함수를 사용한 프로퍼티 기본값 설정 사용자 정의 연산을 통해 저장 프로퍼티 기본값을 설정하고자 한다면? 클로저나 함수 사용 가능 ※ 사용자 정의 연산? 사용자가 원하는 동작을 하는 연산자를 말함 정위 연산자 // 대표적인 예) 논리 부정 연산자 a = !a 중위 연산자 // 대표적인 예) 기본적인 연산자들 a + b 후위 연산자 // 대표적인 예) 옵셔널 관련 연산자 a? 인스턴스를 초기화할 때 함수나 클로저가 호출되면서 연산 결과값을 프로퍼티 기본값으로 제공 ★ 반드시 클로저 또는 함수의 반환 타입 = 프로퍼티의 타입 ★ 클로저를 통한 프로퍼티 기본값 설정 class SomeClass { let someProperty: SomeType = { // 새로운 인스턴스를 생성하고 사용자 정의 연산을 통해 반..

iOS/Swift 2024.02.01

내비게이션 타이틀에 이미지 표현하기

이미지를 이용하여 UIImage 객체 생성 => 이미지 뷰 객체를 생성 => 내비게이션 아이템의 타이틀 뷰 속성에 이미지 뷰 대입 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.initTitle() } // 네비게이션 이미지 표현 func initTitle() { let image = UIImage(named: "swift_logo") let imageV = UIImageView(image: image) self.navigationItem.titleView = imageV } }

iOS/UIKIT 2024.01.31

내비게이션 타이틀 커스터 마이징하기

일반적으로 네비게이션 바에서 타이틀을 설정하는 구문 self.navigationItem.title = "게시물 목록" 좀 더 커스터마이징 한다면? 먼저 Main.storyboard 파일 안에 내비게이션 컨트롤러를 추가함 내비게이션 타이틀에 표시할 메소드 func initTitle() { // 네비게이션 타이틀용 레이블 객체 let nTitle = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40)) // 속성 설정 nTitle.numberOfLines = 2 // 2줄 표시 nTitle.textAlignment = .center nTitle.font = UIFont.systemFont(ofSize: 15) nTitle.text = "58개 숙소 \n 1..

iOS/UIKIT 2024.01.31