본문 바로가기

iOS/Swift14

Swift-11. 고차 함수 - map, filter, reduce ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 고차함수 # - 고차함수(Higher-order-function)는 '다른 함수를 전달인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수'를 말합니다. - 고차함수 중에서도 map, filter, reduce 함수는 스위프트 표준 라이브러리의 컨테이너 타입(Array, Set, Dictionary 등)에 구현되어 있습니다. [ map ] - 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성 /* 변형하고자 하는 numbers와 변형 결과를 받을 dn, str 선언 */ let numbers: [Int] = [0, 1, 2, 3, 4] var dn: [Int] var str: [String] /* 1. 기존의 for 구문 .. 2023. 2. 24.
Swift-10. 오류 처리 - throw, rethrows, defer ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 오류 발생 # - 스위프트에서 오류는 Error라는 프로토콜을 준수하는 타입의 값을 통해 표현됩니다. - Error 프로토콜은 사실 상 요구사항이 없는 빈 프로토콜일 뿐이지만, 오류를 표현하기 위한 타입(주로 열거형)은 이 프로토콜을 채택합니다. [ 오류 표현 ] - Error 프로토콜과 (주로) 열거형을 통해서 오류를 표현 /* 자판기 동작 오류의 종류를 표현한 VendingMachineError 열거형 */ enum VendingMachineError: Error { case invalidInput case insufficientFunds(moneyNeeded: Int) case outOfStock } [ 함수에서 발생한 오류 던지기.. 2023. 2. 24.
Swift-9. 프로토콜(protocol), 익스텐션(extension) ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 프로토콜(protocol) # - 구조체, 클래스, 열거형 등에 프로토콜을 이용해서, 어떠한 기능을 구현해놔야 하는지 알려줍니다. - 클래스 상속은 클래스끼리만 가능했던 것과 달리, 프로토콜을 따르는 것은 클래스 뿐만 아니라 value type인 struct, enum에도 적용 가능합니다. - 따라서 보다 넓은 확장성과 재사용성을 보장합니다. protocol pName { /* 프로토콜 정의 */ } [ 프로퍼티 요구 ] protocol Talkable { /* 프로퍼티 요구 - 항상 var 사용 */ var topic: String { get set } // 읽고 쓰기 모두 가능 var language: String { get } //.. 2023. 2. 24.
Swift-8. assert, precondition, guard ** edwith - Swift 프로그래밍 입문 강의 참고 ** assert - assert(_:_:file:line:) 함수 사용 - 디버깅 모드에서만 동작 (실제 배포 환경에서는 동작 X) - 예상했던 조건의 검증을 위해 사용 - 디버깅 모드에서 assert() 등을 통해 애플리케이션이 죽으면, 죽은 위치가 확실하게 보여집니다. 이를 통해 버그를 방지하거나 디버그에 유용한 정보로 사용할 수 있습니다. var someInt: Int = 0 // 검증 조건과, 검증 실패시 나타날 문구 작성 // assert(someInt == 0, "someInt != 0") someInt = 1 assert(someInt == 0) // 동작 중지, 검증 실패 assert(someInt == 0, "someInt !=.. 2023. 2. 24.
Swift-6. 옵셔널 체이닝, nil 병합 ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 옵셔널 체이닝 # - 옵셔널 체이닝은 옵셔널 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하기 활용 가능 - 매번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인 가능 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': Person? var owner: Person? init(dong: String, ho: String) .. 2023. 2. 24.
Swift-5. 인스턴스 생성 및 소멸 ** edwith - Swift 프로그래밍 입문 강의 참고 ** # init / deinit # 인스턴스를 생성하는 이니셜라이저(init)와 클래스의 인스턴스가 소멸될 때 호출되는 디이니셜라이저(deinit) 프로퍼티 초기값 - swift의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어 있어야 함. - 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 됨. class PersonA { // 모든 저장 프로퍼티에 기본값 할당 var name: String = "unknown" var age: Int = 0 var nickName: String = "been" } // 인스턴스 생성 let eenii: PersonA = PersonA() // 기본값이 인스.. 2023. 2. 24.
Swift-4. 클로저, 프로퍼티 ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 클로저 # - 실행가능한 코드 블럭 - 함수와 다르게 이름정의는 필요하지 않지만, 매개변수 전달과 변환 값이 존재할 수 있다는 점이 동일 - 함수는 이름이 있는 클로저 - 일급객체로 전달인자, 변수, 상수 등에 저장 및 전달이 가능 // 클로저 기본 문법 { (/* 매개변수 목록*/) -> /* 반환 타입 */ in /* 실행 코드 */ } // 클로저 사용 // sum이라는 상수에 클로저 할당 let sum: (Int, Int) -> Int = { (a: Int, b: Int) in return a + b } let sumResult: Int = sum(1, 2) print(sumResult) // 3 // 함수의 전달인자로서의 클로저.. 2023. 2. 24.
Swift-3. 구조체, 열거형 ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 구조체 # - swift 대부분 타입은 구조체로 되어 있습니다. - 구조체는 값(value) 타입 - 타입이름은 대문자 카멜케이스를 사용하여 정의 // 구조체 기본 문법 struct /*이름*/ { /* 구현부분 */ } // 구조체 property 및 method 구현 struct Sample { // 가변 프로퍼티 : 값 변경 가능 var mutableProperty: Int = 100 // 불변 프로퍼티 : 값 변경 불가능 let immutableProperty: Int = 100 // 타입 프로퍼티 : static 키워드 사용 - 타입 자체가 사용하는 프로퍼티 static var typeProperty:Int = 100 // 인스.. 2023. 2. 24.
Swift-2. 반복문, 옵셔널/옵셔널체이닝/옵셔널바인딩 ** edwith - Swift 프로그래밍 입문 강의 참고 ** # 반복문 # for - in 구문 // for-in 구문 기본 형태 for item in items { /* 실행 구문 */ } // 예시 var number = [1, 2, 3] let people = ["yagom": 10, "eric": 15, "mike": 12] for num in number { print(num) } for (name, age) in people { print("\(name): \(age)") } repeat - while 구문 // repeat-while 구문 기본 형태 repeat { /* 실행 구문 */ } while /* 조건 */ // 예시 repeat { number.removeLast() } whi.. 2023. 2. 24.
Swift-1. 변수, 리스트, 함수 ** edwith - Swift 프로그래밍 입문 강의 참고** # 콘솔로그 # print 단순 문자열 출력 dump 인스턴스의 자세한 설명(description property)까지 출력 # 문자열 보간법 # 프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용 // 예시 import Swift let a: Int = 2 let b: Int = 3 print("a와 b의 합은 \(a+b)이다.") // => output : "a와 b의 합은 5이다." # 상수, 변수의 선언 # 상수 선언 키워드 : let => let 이름: 타입 = 값 ▪️(값의 타입이 명확한 경우, 타입 생략 가능 => let 이름 = 값) ▪️let은 constant (상수) 값이므로, 차후에 변경이 불.. 2023. 2. 24.
[Swift 5.5] Async / Await Swift 개발을 하다보면 Closure나 Completion Handlers를 사용하는 asynchronous(비동기) 프로그래밍을 많이 하게 된다. 이처럼 많은 비동기 작업, 오류 처리, 비동기 호출 간의 제어 흐름이 복잡할 때 문제가 된다. 많은 비동기 작업에는 수많은 tab이 들어간 deeply-nested closures가 필요하게 되고, 콜백은 오류 처리를 매우 어렵고 장황하게 만든다. 비동기 호출 간의 제어 흐름이 복잡할 때는 어떠한 closure가 completion handler에서 사용될 때, capture에 대해 신중하게 생각해야 하는 상황이 발생할 수도 있다. 그래서 나오게 된 것이 async와 await다. async와 await는 Swift 5.5부터 새로운 비동기 프로그래밍 패.. 2021. 12. 20.
Swift 접근 제어자 (Access Control) 접근 제어자를 왜 사용할까 오늘은 iOS 개발을 할 때 다양하게 활용할 수 있는 접근 제어자에 대해 알아보려합니다. 규모 있는 어플리케이션을 개발하다보면 객체를 사용하는 입장에서 객체 내부적으로 사용하는 변수나 메서드에 접근함으로써 개발자가 의도하지 못한 오동작을 일으키게 될 수 있습니다. 이런 문제로부터 객체의 로직을 보호하기 위해서 적절한 접근 제어자를 통해 외부의 접근을 허용하거나 차단할 필요가 있습니다. 즉, 접근 제어자는 코드를 작성하는 module이나 source file에서 다른 파일에 있는 코드에 대한 접근을 명시적으로 작성하여 관리하는 것입니다. 여기서 module이란, 하나의 프레임워크를 말합니다. 우리가 Swift로 코드를 짤 때 필요에 따라 적절한 import 키워드를 추가하죠? 그.. 2021. 5. 7.