분류 전체보기64 제네릭 (제네릭 제약, 제네릭 확장, 제네릭 함수와 오버로딩) 타입 제약 제네릭 함수와 타입을 사용할 때, 특정 클래스의 하위 클래스나 특정 프로토콜을 준수하는 타입만 받을 수 있게 제약할 수 있다. 프로토콜 제약 두 개의 값을 파라미터로 받을 때, 값이 같으면 true 또는 값이 다르면 false를 반환하는 함수를 제네릭으로 선언한다면? func isSameValues(_ a: T, _ b: T) -> Bool { return a == b // Binary operator '==' cannot be applied to two 'T' operands } 에러가 발생한다. 이유는, " == " 이라는 연산자는 a와 b의 타입이 Equatable 이라는 프로토콜을 준수할 경우에만 사용할 수 있기 때문이다. 따라서 아래와 같이 타입 파라미터가 " Equatable " 프.. 2024. 4. 16. 제네릭 타입에 의존하지 않는 범용 코드를 작성할 떄 사용한다. ⭐제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다. 두 Int 타입의 값을 변환하는 함수를 만든다면? func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tempA = a a = b b = tempA } 위의 함수는 Int 타입 말고, Double 이나 String 일 경우에는 사용할 수 없다. 이 때 사용하는 것이 바로 제네릭이다. func swapTwoValues(_ a: inout T, _ b: inout T) { let tempA = a a = b b = tempA } "" 를 이용해서 안에 타입처럼 사용할 이름 (T)를 선언해주면 그 뒤로 해당 이름(T)를 타입처럼 사용할.. 2024. 4. 15. 고차함수 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 변환하는 함수이다. 스위프트에서 함수(클로저)는 일급 시민이기 때문에 함수의 전달인자로 전달할 수 있고, 함수의 결과값으로 반환할 수 있다. map 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다. 1️⃣ 변형하고자 하는 numbers / 변형 결과를 받을 doubledNumbers, strings let numbers: [Int] = [0, 1, 2, 3, 4] var doubledNumbers: [Int] = [] var strings: [String] = [] 2️⃣ 기존의 for 구문 사용 for number in numbers { doubledNumbers.append(number * 2) strings.append("\(.. 2024. 4. 15. 오류처리 스위프트에서 오류(Error)는 Error라는 프로토콜을 준수하는 타입의 값을 통해 표현된다. ⭐️ Error 프로토콜은 사실상 요구사항이 없는 빈 프로토콜이다. ⭐️ 오류를 표현하기 위한 타입 (주로 열거형)은 이 프로토콜을 채택한다. 오류표현 Error 프로토콜과 열거형을 통해 오류를 표현한다. enum 오류종류이름: Error { case 종류1 case 종류2 case 종류3 //... } ⭐ HTTP 상태 코드를 참고하여 만든 예시 오류 enum HttpError: Error { case badRequest case unauthorized case forbidden case notFound case requestTimeOut case conflict } 함수에서 발생한 오류 던지기 자판기 동작 .. 2024. 4. 13. 익스텐션 구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능이다. 타입만 알고 있다면, 그 타입의 소스 코드를 모르더라도 기능을 확장할 수 있다. ⭐️ 익스텐션은 타입에 새로운 기능은 추가할 수 있지만, 기존에 존재하는 기능을 재정의할 수 없다. 익스텐션을 사용하는 대신에 원래 타입을 정의한 곳에서 추가하는 방법도 있지만, 외부 라이브러리나 프레임워크를 가져다 쓴다면 수정하지 못한다. 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 익스텐션을 사용한다. 익스텐션 구현 연산 프로퍼티 추가 extension Int { var isEven: Bool { return self % 2 == 0 } var isOdd: Bool { return self % 2 == 1 } } print.. 2024. 4. 12. Result Type (리절트 타입) 스위프트5에서 새롭게 추가된 Result Type은 에러 처리할 때 사용한다. 에러가 발생하는 경우 리턴 타입 자체를 Result Type으로 구현해서 함수 실행의 성공과 실패의 정보를 담아서 반환한다. ▶️ 기존의 에러 처리인 경우, 성공과 실패에 대한 결과를 따로 처리하고 do catch 블럭으로 감싸야 한다. 에러정의 enum MyError: ErrorType { case someError case criticalError } throws를 활용한 에러처리 func doSomething() throws { throw MyError.someError } do { try doSomething() } catch let myError as MyError { switch myError { case .some.. 2024. 4. 12. 프로토콜 프로토콜은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의한다. 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을 구현할 수 있다. 어떤 프로토콜의 요구사항을 모두 따르는 타입은 해당 프로토콜을 준수한다라고 표현한다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 한다. ⭐️ 프로토콜은 기능을 정의하고 제시할 뿐, 스스로 기능을 구현하지 않는다. 정의문법 protocol 프로토콜 이름 { /* 정의부 */ } 프로토콜의 요구는 항상 "var" 키워드를 사용한다. get은 읽기만 가능, get + set을 모두 명시하면 읽기 + 쓰기 모두 가능하다는 뜻이다. 프로토콜 구현 protoc.. 2024. 4. 11. 공공 API를 어떻게 갖고 오나? (공공 API를 GET 하는 방법) 먼저 스위프트로 API를 갖고 오는 코드 구현 URL 구조체 생성 URL은 옵셔널 바인딩 처리를 해야 한다. 주소는 아이튠즈 API 갖고 왔다. https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html#//apple_ref/doc/uid/TP40017632-CH5-SW1 iTunes Search API: Constructing Searches developer.apple.com guard let url = URL(string: "https://itunes.apple.com/search?&term=jazz") else { print("Error: cannot creat.. 2024. 4. 9. assert와 guard 애플리케이션이 동작 도중에 생성하는 다양한 연산 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 확인 및 처리할 수 있다. Assertion assert 함수는 디버깅 모드에서만 동작 배포하는 애플리케이션에서는 제외된다. 주로 디버깅 중 조건의 검증을 위하여 사용한다. 조건이 맞지 않으면 동작을 중지하면서 에러 표시에 메시지가 나온다. 나이를 확인하고 에러 발생하면 디버깅 창에서 에러창이 보이게 하는 함수를 생성한다면? 빠른 종료 "guard"를 사용하여 잘못한 값의 전달 시 특정 실행구문을 빠르게 종료한다. "guard"의 "else" 블럭 내부에는 특정 코드 블럭을 종료하는 지시어 (return, break 등)가 꼭 있어야 한다. 타입 캐스팅, 옵셔널과도 자주 사용된다. func functio.. 2024. 4. 9. 옵셔널 체이닝 옵셔널 체이닝 옵셔널의 내부의 내부의 내부로 옵셔널이 연결되어 있을 떄 활용할 수 있다. 매 번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다. Person 클래스의 home 이라는 프로퍼티는 Apartment 클래스 타입을 사용한다. Apartment 클래스의 guard, owner 프로퍼티는 Person 클래스 타입을 사용한다. class Person { var name: String var job: String? var home: Apartment? init(name: String) { self.name = name } } class Apartment { var buildingNumber: String var roomNumber: String var `guard`: .. 2024. 4. 6. 싱글톤 패턴 (Singleton Pattern) 싱글톤 패턴 특정 용도로 객체를 1개만 생성 공용으로 사용하고 싶을 때 사용하는 디자인 유형 싱글톤 생성하기 static 프로퍼티로 인스턴스 생성하기 class FruitInfo { static let shared = FruitInfo() var name: String? var count: Int? } Init 함수 접근제어자를 private로 하기 ▶️ init 함수를 통해 인스턴스 생성을 막기 위함 class FruitInfo { static let shared = FruitInfo() var name: String? var count: Int? private init() { } } 싱글톤 접근 하기 어디서든 shared란 static 프로퍼티로 접근하면 된다. let marketA = FruitIn.. 2024. 4. 5. 인스턴스의 생성과 소멸 이니셜라이저: 인스턴스를 생성 디이니셜라이저: 인스턴스 소멸될 때 호출 프로퍼티 기본값 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효값이 할당되어 있어야 한다. 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 된다. class Actor { // 모든 저장 프로퍼티에 기본값 할당 var name: String = "no selected" var age: Int = 0 var titleMovie: String = "no selected" } // 인스턴스 생성 var robert: Actor = Actor() // 생성된 인스턴스의 프로퍼티에 각각 값 할당 robert.name = "로버트 다우닝 주니어" robert.age = 50 robert.titleM.. 2024. 4. 5. 이전 1 2 3 4 5 6 다음