목록Swift (17)
Jimmy's iOS

XLPagerTapStrip 을 이용하여 코드로 여러 뷰 컨트롤러들의 페이징을 간단하게 연습해 보았습니다. 1) 코코아 팟으로 XLPagerTapStrip 인스톨 하기 pod 'XLPagerTabStrip', '~> 9.0' 2) MainViewController 에 ButtonBarPagerTabStripViewController 를 상속받아서 buttonBarView 레이아웃과 세팅 설정하기 import UIKit import XLPagerTabStrip import SnapKit class MainViewController : ButtonBarPagerTabStripViewController { // MARK: - Properties // MARK: - LifeCycle override func v..
1) 제네릭 문법의 필요성 // Int 배열 출력 func printArray(array : [Int]) { for number in array { print(number) } } // Double 배열 출력 func printArray(array : [Double]) { for number in array { print(number) } } // String 배열 출력 func printArray(array : [String]) { for number in array { print(number) } } 단순히 인풋 타입만 다르고 구현 내용은 완전 동일한데 굳이 코드를 반복할 필요가 있나? 제네릭이 없다면, 타입마다 모든 경우를 다 정의해야 하기 때문에 개발자의 할일이 늘어난다. (유지보수/ 재사용성 관..
Defer 문 defer 문은 코드의 실행을 스코프가 종료되는 시점으로 연기시키는 문법이다. 일반적인 사용은, 어떤 동작의 마무리 동작을 특정하기 위해서 사용한다. func useDeferStatement1() { defer { print("나중에 실행하기") } print("먼저 실행하기") } useDeferStatement1() // 먼저 실행하기 // 나중에 실행하기 func useDeferStatement2() { if true { print("먼저 실행하기") return } defer { // 디퍼문이 한번은 호출되어야, 해당 디퍼문이 실행된다. print("나중에 실행하기") } } useDeferStatement2() // 먼저 설행하기 func useDeferStatement3() { ..
기존 옵셔널은 옵셔널 바인딩을 통해서 언래핑하여 값을 사용했었다. let text : String? = "hello world" if let text = text { print(text) } Swift 5.7 에서 옵셔널 처리를 간단하게 할 수 있게 되었다! let text : String? = "hello world" if let text { print(text) }
패러다임(paradigm) 이란? 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다. 스위프트의 프로그래밍 패러다임은 3가지 이다. 객체 지향 프로그래밍(Object-Oriented Programming) 프로토콜 지향 프로그래밍(Protocol-Oriented Programming) 함수형 프로그래밍(Functional Programming) 함수형 프로그래밍에 대한 간단 이해 먼저 우리가 많이 들어본 명령형 프로그래밍에 대해 알아보자 1) 명령형 프로그래밍 - 어떻게 구현해낼까? / 설계 -> How let numbers = [1, 2, 3] var sum = 0 for number in numbers ..
고차함수란? '함수' 를 파라미터로 사용하거나, 함수실행의 결과를 '함수' 로 리턴하는 함수 고차함수로는 map, filter, reduce, forEach, compactMap, flatMap 등이 있다. Sequence, Collection 프로토콜을 따르는 컬렉션(배열, 딕셔너리, 세트 등) 에 기본적으로 구현되어 있는 함수 Optional 타입에도 구현되어 있다. map 기존 배열 등의 각 아이템을 새롭게 매핑해서(매핑방식은 클로저를 통해서 제공) 새로운 배열을 리턴하는 함수 각 아이템을 매핑해서, 변형하여 새로운 배열을 만들 때 사용한다. let numbers = [1, 2, 3, 4, 5] var newNumbers = numbers.map { (num) in return "숫자: \(num)..
클로저는 간단하게 이야기 하면 이름이 없는(익명) 함수 라고 한다. 클로저는 함수이긴 하면서 함수와 기능은 완전히 동일한데 좀 더 큰 범위라고 생각하면 된다. 함수 클로저 - 이름이 있는 코드 묶음 - 다른 코드가 함수이름으로 호출하기 위함 - 이름이 없는 코드 묶음 - 굳이 이름이 없어도 호출할 수 있는 형태로 사용 가능 func doSomthing() -> Int { ... return ... } { () -> Int in ... return ... } 일급객체 클로저를 이해하기 전에 먼저 일급객체에 대해서 알아보자 스위프트는 함수(클로저 도 해당) 를 '일급객체' 로 취급한다. -> 함수는 타입이다. 함수를 변수에 할당할 수 있다. 함수를 호출할때, 함수를 파라미터로 전달할 수 있다. 함수에서 함수..
보통 프로토콜을 구현해서 채택을 하게 되면 반드시 구현한 내용들을 모두 사용을 해야했었다. 하지만 프로토콜에서 요구사항 구현시, 선택적인 멤버로 구현가능 하도록 변형이 가능하다. @objc Protocol SomeProtocol { var number : Int { get } // 일반적 저장 속성 @objc optional var name : String { get } // 선택적 저장 속성 @objc optional func doSomething() // 선택적 메서드 } 1. Protocol 선언 앞에는 '@objc' 키워드를 붙여서 추가적인 정보를 제공. 2. 원하는 멤버 앞에 '@objc optional' 키워드를 선언. * (@objc 는 클래스 전용 프로토콜이기 때문에, 구조체/열거형에서는 ..
1. @ 어트리뷰트 키워드 : 추가적인 정보를 제공하는 키워드 이다. 컴파일러에게 추가적인 정보를 알려주는 역할을 하는 2가지 경우 1) 선언에 추가정보 제공 @available(iOS 10.0) // -> 선언에 추가정보 제공 class Something { } 2) 타입에 추가정보 제공 func doSomething(completion : @escaping () -> ()) { // @escaping 타입에 추가정보 제공 } 2. @discardableResult : 함수의 리턴값을 활용하지 않는 경우에 사용한다. 1) 일반적인 함수 선언 경우 func makeSomething() -> String { ... return "Car" } makeSomething() // 노란색으로 결과값을 사용하지 않..
프로젝트를 하면서 문자열로 날라오는 날짜를 Date 형식으로 다시 바꿔야 할 일이 있어서 extension 으로 DateFormatter 를 활용하여 바꿔보았다. 1. 문자열 (String) 을 날짜 (Date) 형식으로 변환 extension String { func toDate() -> Date? { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" dateFormatter.locale = Locale(identifier: "ko") if let date = dateFormatter.date(from: self) { return date } else { return nil } } } 2. 날짜(Dat..