목록Swift 기초 (13)
공부한 것 꼭꼭 씹어먹기
고차함수 : 다른 함수를 전달 인자로 받거나 함수 실행의 결과를 함수로 반환하는 함수(map, filter, reduce) 스위프트에서 함수는 일급객체이기 때문에 파라미터도 되고 리턴값도 될 수 있다 // map let numbers = [0,1,2,3] let mapArray = numbers.map { (number) -> Int in return number * 2 } // filter let intArray = [10,5,20,13,4] let filterArray = intArray.filter { $0 > 5 } // 클로저 표현 감소화 방법 활용함 // reduce : 컨테이너 내부의 요소를 하나로 통합(누적하여 더함) let someArray = [1,2,3,4,5] let reduceRe..
클로저 : 코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있음 일급객체 : 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환값이 될 수 있다 // 클로저 표현식 : 주로 익명함수를 쓴다 { (매개 변수) -> 리턴 타입 in // 실행 구문 } // 파라미터와 리턴타입이 없는 클로저 정의 let hello = { () -> () in print("hello") } // 클로저 호출 hello() // 파라미터와 리턴타입이 있는 클로저 정의 let hello2 = { (name: String) -> String in return "Hello, \(name)" } // 클로저 호출 hello2(name: "Gunter") // 에러발..
스위프트에서 오류를 처리하는 방법 함수에서 발생한 오류를 해당 함수를 호출한 코드에 전파하는 방법 : throws do-catch 구문을 이용하는 방법 옵셔널 값으로 오류를 처리하는 방법 : try? 오류가 발생하지 않을 것이라고 확신하는 방법 : try! // 에러를 열거형으로 정의 enum PhoneError: Error { case unknown case batteryLow(batteryLevel: Int) } // 에러가 발생할 것 같은 지점에 아래 에러를 던저주자 throw PhoneError.batteryLow(batteryLevel: 20) // 1. 함수에서 발생한 오류를 해당 함수를 호출한 코드에 전파하는 방법 func checkPhoneBatteryStatus(batteryLavel: ..
옵셔널 체이닝 : 옵셔널에 속해 있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정 struct Developer { let name: String } struct Company { let name: String var developer: Developer? } var developer = Developer(name: "han") var company = Company(name: "Gunter", developer: developer) print(company.developer) // Optional에 감싸인 developer 객체 출력됨 print(company.developer.name) // 에러 // company.developer는 옵..
익스텐션 : 기존의 클래스, 구조체, 열거형, 프로토콜에 새로운 기능을 추가할 수 있다.(연산 프로퍼티는 추가 가능. 저장프로퍼티는 추가 불가능. 새로운 기능 추가는 가능하지만 기존 기능을 오버라이드 하지는 못함) extension Int { // Int타입에 isEven, isOdd라는 연산프로퍼티를 추가함 -> 기능의 확장 var isEven: Bool { return self % 2 == 0 } var isOdd: Bool { return self % 2 == 1 } } var number = 3 number.isOdd // true number.isEven // false extension String { // String타입에 convertToInt라는 메서드를 추가함 -> 기능의 확장 func..
프로토콜 : 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의하고 자신을 채택한 구조체, 클래스, 열거형에게 정의된 요구사항을 준수하라고 요청함 (🐣 프로토콜은 자바의 interface같은 것인가??) protocol SomeProtocol { } protocol SomeProtocol2 { } // SomeStructure 구조체는 someProtocol, someProtocol2를 채택함 struct SomeStructure: SomeProtocol, SomeProtocol2 { } // 클래스는 상속받는 부모클래스가 있을 경우 가장 앞에 써줘야 함 class SomeClass: SomeSuperClass, SomeProtocol, SomeProtocol2 {} protoc..
// 인스턴스의 타입 확인하기 : is // 기생충이 Movie 타입이거나 Movie의 서브클래스이면 true, 그 외에는 false class Movie {} var 기생충 = Movie() 기생충 is Movie // 기생충은 Movie 클래스 타입이다 == true let char: Character = "A" char is Character // ture char is String // false // 다운캐스팅 : as?, as!(이건 확신있을때만)
// 프로퍼티 오버라이드 // 프로퍼티 재정의 : 프로퍼티 자체가 아닌 프로퍼티의 getter/setter/opserver를 재정의 class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } } class Car: Vehicle { var gear = 1 override var currentSpeed: Double { // 상속받은 프로퍼티에 옵저버를 붙여보았다 didSet { gear = Int(currentSpeed / 10) + 1 } } override var description: String { // 상속받은 프로퍼티에 setter를 변경해..