본문 바로가기

⌨️ Language37

[Swift] 제네릭 (Generic) 제네릭 (Generic) 타입을 파라미터화 하여 컴파일 타임에 구체적인 타입이 결정되는 것을 의미 제네릭을 이용하면 타입에 유연하게 대처하는 것이 가능 제네릭으로 구현한 기능과 타입은 재사용에 용이 코드의 중복을 줄일 수 있어서 깔끔한 표현이 가능 Swift에서의 대표적인 제네릭 타입으로는 Array와 Dictionary 타입이 Array와 Dictionary는 Int 값을 저장할 수도 있고, String 값을 저장할 수도 있으므로, 타입에 제한이 없음 // String 타입을 갖는 두개의 값을 바꾸는 함수 func swapTwoStrings(_ a: inout String, _ b: inout String) { let temporaryA = a a = b b = temporaryA } // Double.. 2023. 2. 7.
[Swift] 에러 처리 에러 처리 (ErrorHandling) 프로그램 실행 시 에러가 발생하면 그 상황에 대해 대응하고, 이를 복구하는 과정 Swift에서는 런타임 에러가 발생한 경우 처리를 위해 에러의 발생(throw ing), 감지(catching), 전파(propagating), 조작(manipulating)을 지원하는 일급 클래스를 제공 에러의 표시와 발생 (Representing and Throwing Errors) Swift에서 에러는 Error 프로토콜을 따르는 타입의 값으로 표현 Error 프로토콜은 비어있으며 에러 처리에 타입을 사용할 수 있음을 나타냄 enum ServerError: Error { case forbidden case notFound case internalError case unauthori.. 2023. 2. 7.
[Swift] 고차함수 고차함수 고차함수는 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수 swift의 함수(클로저)는 일급시민이기 때문에 함수의 전달인자로 전달할 수 있으며, 함수의 결괏값으로 반환할 수 있음 일급객체 (First Class Citizen) 객체가 런타임에도 생성 가능하다. 객체를 인자 값으로 전달할 수 있어야 한다. 객체를 반환 값으로 사용할 수 있어야 한다. 데이터 구조 안에 저장할 수 있어야 한다. map 기존의 컨테이너의 요소에 대해 정의한 클로저로 매핑한 결과를 새로운 컨테이너로 반환 //For문 사용 let numArray = [1,2, 3, 4, 5, 6, 7, 8, 9] var multiplyArray = [Int]() for num in numArray{ multiplyA.. 2023. 2. 6.
[Swift] 클로저 (Closure) 클로저 (Closure) 사용자의 코드 안에서 전달되어 사용할 수 있는 로직을 가진 중괄호"{}" 구분된 코드의 블록 이름이 없는 함수 클로저는 어떠한 상수나 변수의 참조를 캡처(capture)해서 저장 가능 Swift는 이 캡처와 관련한 모든 메모리를 알아서 처리 파라미터를 받을 수 있고, 반환 값이 존재할 수 있다는 점에서 함수와 동일 Swift 클로저는 최적화를 통해 깔끔하고 명확한 스타일을 가지고 있음 문맥(context)에서 인자 타입과 반환 타입의 추론 단일 표현식 클로저의 암시적 반환 축약된 인자 이름 후위 클로저 문법 { (매개변수 이름 : 매개변수 타입) -> 반환타입 in 클로저 표현식 코드 } 후행 클로저 (trailing closure) 클로저가 함수의 마지막 argument라면, .. 2023. 2. 6.
[Swift] 익스텐션 (Extensions) 익스텐션 (Extensions) 익스텐션을 이용해 클래스, 구조체, 열거형 혹은 프로토콜 타입에 기능을 추가 가능 익스텐션은 타입에 새로운 기능을 추가할 수 있지만, 오버라이드는 할 수 없음 계산된 인스턴스 속성 및 계산 유형 속성 추가 인스턴스 메서드 및 타입 메서드 정의 새 이니셜라이저 제공 Subscript 정의 새 중첩 타입 정의 및 사용 기존 타입을 프로토콜에 맞게 설정 extension Int { var add: Int { return self + 100 } var sub: Int { return self - 10 } var mul: Int { return self * 10 } var div: Int { return self / 5 } } let addition = 3.add print("Ad.. 2023. 2. 6.
[Swift] 프로토콜 (Protocol) 프로토콜 (Protocol) 특정 작업이나 기능에 적합한 메서드, 프로퍼티 및 기타 요구사항의 ‘약속’을 정의 클래스(class), 구조체(struct), 열거형(enum)에서는 어떠한 프로토콜을 채택하여 해당 프로토콜의 요구사항을 실제로 구현 가능 프로토콜의 요구사항을 충족시키는 모든 타입은 해당 프로토콜을 준수한다 혹은 따른다고 함 프로토콜을 채용한 형식은 요구사항을 반드시 모두 구현해야 함 프로토콜은 프로토콜 간 상속을 지원하며, 클래스와 달리 다중 상속도 지원 프로토콜 채택하기 클래스, 구조체, 열거형에서 정의한 프로토콜을 채택하기 위해서는 콜론(:)을 사용 하나의 타입에서 다수의 프로토콜을 채택하기 위해서는 콤마(,)를 사용 클래스에서 상속과 프로토콜 채택을 동시에 하려면 상속받으려는 클래스를 .. 2023. 2. 6.
[Swift] assert와 guard assert 특정 조건을 체크하고, 조건이 성립되지 않으면 메시지를 출력하게 할 수 있는 함수 assert 함수는 디버깅 모드에서만 동작하고 주로 디버깅 중 조건의 검증을 위하여 사용 var value = 0 assert(value == 0) value = 2 assert(value == 0, "값이 0이 아닙니다.") 첫 번째 assert는 참이기 때문에 오류가 발생하지 않음 두 번째 assert는 거짓이기 때문에 런타임에러가 발생 Assertion failed: 값이 0이 아닙니다. guard 문 조건을 검사하여 그다음에 오는 코드를 실행할지 말지 결정하는 구문 guard을 사용하여 조건이 성립하지 않을 시 특정 실행 구문을 빠르게 종료 guard의 else 블록 내부에는 특정 코드 블록을 종료하는 .. 2023. 2. 6.
[Swift] 타입 캐스팅 타입 캐스팅 (Type Casting) 인스턴스의 "타입"을 확인하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법 Swift에서 타입 캐스팅은 "is"나 "as" 연산자로 구현 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인 가능 is 타입을 체크하는 연산자 런타임 시점에 실제 체크가 이루어짐 반환 값은 Bool 형 표현식이 Type과 동일하거나, 표현식이 Type의 서브클래스인 경우 True를 반환 이 외에는 False 반환 //1 let char: Character = "A" char is Character // true char is String // false //2 class Animal { } class Dog: Animal { } let dog: Dog = ... 2023. 2. 6.
[Swift] 클래스(Class)와 구조체(Struct) 클래스(Class) 클래스를 정의하여 객체를 만들고 사용 가능 클래스를 만들어 클래스에서 생성된 객체인 인스턴스를 만들어 사용 클래스 안의 변수 프로퍼티(Property)와 클래스 안의 함수 메서드(Method)로 구성 class Name { var name = "Hyebin" //프로퍼티 //메서드 func my_name() { print("my name is \(name)") } } //인스턴스 생성 let hyebin : Name = Name() print(hyebin.name)// Hyebin hyebin.my_name()// my name is Hyebin hyebin.name = "yoo" hyebin.my_name()// my name is yoo 클래스 초기화 (Initialization).. 2023. 2. 6.
[Swift] 옵셔널 (Optional) 옵셔널(Optional) 값이 있을 수도 있고 없을 수도 있는 변수 값이 없는 경우를 나타낼 때에는 nil을 사용 변수 정의할 때 타입 어노테이션에 물음표(?)를 붙여 정의 Optional(value) 형태로 출력 옵셔널에 초깃값을 지정하지 않으면 기본값은 nil var name: String? print(name) //nil name = "hyebin" print(name) //Optional("hyebin") 옵셔널로 정의한 변수는 옵셔널이 아닌 변수와는 다름 var optional_name: String? = "hyebin" let name: String = optional_name Value of optional type 'String?' must be unwrapped to a value of .. 2023. 2. 6.
반응형