[Swift] 28. 고차 함수 (map, filter, reduce)
2020. 12. 7. 20:33
iOS/Swift
고차 함수 | Higher-order function 고차 함수는 다른 함수를 전달인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수 를 뜻한다. 스위프트의 함수(클로저)는 일급시민(일급객체)이기 때문에 함수의 전달인자로 전달할 수 있고 함수의 결과 값으로 반환할 수 있다. 스위프트에서 제공하는 map, filter, reduce 고차 함수가 있고 컨테이너 타입(Array, Set, Dictionary 등) 에 구현되어 있다. map : 변형 map 함수는 컨테이너 내부의 기존 데이터를 변형하여 새로운 컨테이너를 생성한다. for 구문과 비슷하게 사용할 수 있지만 map 을 사용하게 되면 클로저 상수를 통해 코드의 재사용이 용이해지고 컴파일러 최적화 측면에서 성능이 좋아진다. 다음 예를 통해 확인해보..
[Swift] 27. 오류 처리
2020. 12. 4. 17:27
iOS/Swift
스위프트에서 오류는 Error 라는 프로토콜을 준수하는 타입의 값을 통해 표현된다. Error 프로토콜은 사실상 요구사항이 없는 빈 프로토콜일 뿐이지만, 오류를 포현하기 위한 타입(주로 열거형)은 이 프로토콜을 채택한다. 스위프트의 열거형은 오류의 종류를 나타내기에 아주 적합한 기능이다. 연관 값을 통해 오류에 관한 부가 정보를 제공할 수도 있다. 프로그램 내에서 자판기를 작동시키려고 할 때 발생하는 오류상황을 구현해보았다. 오류 표현하기 Error 프로토콜과 주로 열거형을 통해서 오류를 표현한다. // 자판이 동작 오류의 종류를 표현한 열거형 enum VendingMachineError: Error { case invalidInput case insufficientFunds(moneyNeeded: In..
[Swift] 23. assert / guard
2020. 11. 29. 20:08
iOS/Swift
Assertion assert(_:_file:line:) 함수를 사용한다. assert 함수는 디버깅 모드에서만 동작한다. 배포하는 애플리케이션에서는 제외된다. 예상했던 조건의 검증을 위하여 사용한다. 다음과 같이 사용해볼 수 있다. var someInt: Int = 0 assert(someInt == 0, "someInt != 0") // 확인을 위해 someInt 의 값을 1로 변경 someInt = 1 assert(someInt == 0, "someInt != 0") ========== 출력 결과 ========== Assertion failed: someInt != 0: file __lldb_expr_33/study23.playground, line 8 검증에 실패했고 실패한 메시지가 나타나고 f..
[Swift] 22. 타입 캐스팅 (type casting)
2020. 11. 25. 18:27
iOS/Swift
스위프트의 타입캐스팅 타입 캐스팅은 인스턴스의 타입을 확인하는 용도 이다. 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도 is , as 연산자를 사용한다. 정리해서, 인스턴스의 타입을 확인하거나 인스턴스 타입의 슈퍼클래스 또는 서브클래스 타입처럼 다루기 위해 사용! 다음 클래스를 통해 예를 들어서 확인해보려고 한다. class Person { var name: String = "" func breath() { print("하트 비트") } } // Person 클래스 상속 class Student: Person { var school: String = "" func goToSchool() { print("학교 가자") } } // Student 클래스 상속 clas..
[Swift] 21. 옵셔널 체이닝과 nil 병합
2020. 11. 18. 19:18
iOS/Swift
이전에 옵셔널 체이닝에 대해서 다루었던 것이 기억난다. 옵셔널 체이닝은 옵셔널 내부의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용할 수 있다. 매번 nil 을 확인하지 않아도 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다. 이렇게 말하면 이해가 잘 되지 않으니 예제를 통해 알아봐야겠다. 옵셔널 체이닝 | Optional Chaining 우선, 두 개의 클래스를 만들었다. 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..
[Swift] 20. 인스턴스 생성 및 소멸 (init / deinit)
2020. 11. 11. 18:16
iOS/Swift
인스턴스를 생성하는 이니셜라이저와 인스턴스가 소멸될 때 호출되는 디이니셜라이저에 대해서 공부하려고 한다. 클래스나 구조체 등을 만들때 프로퍼티의 값을 할당해주었던 것을 생각해보자. 저장 프로퍼티에 값을 할당하지 않으면 에러가 발생한다. 그래서 인스턴스를 생성함과 동시에 초기값을 따로 할당해서 사용했다. 그런데 초기화와 동시에 프로퍼티의 값을 할당하고 싶을 때 이니셜라이저를 사용할 수 있다. 프로퍼티 초기값 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어야 한다. 프로퍼티에 미리 기본 값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 된다. 다음 예를 통해 확인할 수 있다. class PersonPropertyInit { // 모든 저장 프로퍼티에 기본값 할당 va..
[Swift] 19. 상속(Inheritance)
2020. 11. 9. 20:20
iOS/Swift
스위프트 상속(Inheritance) 상속은 클래스, 프로토콜 등에서 가능하다. 열거형, 구조체는 상속이 불가능하다. 스위프트의 클래스는 단일 상속으로, 다중 상속을 지원하지 않는다. 프로토콜의 경우 여러개를 채택할 수 있다. 상속하는 클래스는 하위클래스(subclass), 상속받은 클래스는 슈퍼클래스(superclass) 로 알려져있다. 이번에는 클래스의 상속에 대해서 공부할 예정이다. 클래스에서 상속은 다음과 같이 사용할 수 있다. class 이름: 상속받을 클래스 이름 { 구현부 } 클래스를 정의한 후 변수나 상수에 타입을 정해줄 때 처럼 상속을 해줄 수 있다. 예를 들어, 상속할 상위 클래스를 만들어 보았다. class Person { var name: String = "" func selfInt..
[Swift] 17. 클로저(closure) 고급
2020. 11. 3. 16:12
iOS/Swift
클로저를 다양하게 사용하는 방법에 대해서 공부했다. 후행클로저, 반환타입 생략, 단축 인자 이름, 암시적 반환 표현 의 다양한 모습으로 클로저를 표현할 수 있다. 일반적으로 클로저는 다음과 같이 사용할 수 있다. // 클로저 기본 표현 func calcluate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int { return method(a, b) } 지난 번에 클로저 기본에 대해서 공부할 때 함수의 인자로 받아 사용했던 기억이 있다. 이번에는 클로저의 기본 문법에서 다양한 모습으로 바꿔서 사용해보려고 한다. 후행 클로저 함수의 매개변수 마지막으로 전달되는 클로저는 후행 클로저(trailing closure)로 함수 밖에 구현할 수 있다. 클로저가 함수의 마지막 ..