swift
-
swift - Initializer and Deinitializer #5 (Faliable Initializer)swift 2021. 1. 12. 16:21
Nonfailalbe init - 실패를 허용하지 않는 init 그러나?? 실패를 허용해야 하는 경우도 존재한다. 예로 파일을 초기화하는 코드같은 경우 파일이 존재한다면 정상적으로 초기화가 진행되겠지만 파일이 존재하지 않거나 어떤 문제로 인해 읽을 수 없다면 runtime err가 발생한다. Failalbe Init initializer의 Optional 버전이라고 생각하면 쉽다. // init? -> 성공시 초기화된 instance가 optional 형식으로 return 실패시 nil // init! -> 성공시 강제 추출된 NonOptional 형식의 instance 실패시 crush struct Position { let x: Double let y: Double init?(x: Double, y:..
-
swift - Initializer and Deinitializer #4 (Initializer Delegate)swift 2021. 1. 12. 16:07
Initializer Delegate 값 형식과 참조 형식에서 서로 다른 규칙으로 구현된다. 값 형식은 상속이 불가능하고 init 종류가 하나기 때문에 상대적으로 단순 값 형식의 Initializer init이 실행이 완료되었을때 모든 속성이 초기화 되기만 하면 어떤 패턴으로 구현되어도 상관 없다. 참조 형식의 Initializer 상속을 지원하고 구현할 수 있는 init의 종류가 두가지이기 때문에 복잡 특히 상속 계층을 따라 올라가면서 모든 init이 순서대로 호출되는 것이 매우 중요 규칙 1. designated init은 반드시 super class의 designated init을 호출해야한다. -> Delegate up * 파란색이 Deisgnated init 회색은 convenience init..
-
swift - Initializer and Deinitializer #3 (Required Initializer)swift 2021. 1. 12. 15:46
class Figure { var name: String required init(name: String) { self.name = name } func draw() { print("draw \(name)") } } class Rectangle: Figure { // 모든 속성이 기본값을 가지고 있고 init을 직접 구현하지 않았기 때문에 super class의 init을 상속받음 // 여기서 name 파라미터를 받는 init을 직접 구현하도록 강제하고 싶다면? -> required init var width = 0.0 var height = 0.0 // super class의 init을 상속받지 않기 위해 init 직접구현 init() { width = 0.0 height = 0.0 super.init..
-
swift - Initializer and Deinitializer #2 (Class Initializer, Designated Initializer, Convenience Intializer)swift 2021. 1. 12. 15:40
// Designated Intializer : 지정 생성자 (Initializer Delegate를 해야함) // - default init을 사용하거나 슈퍼 클래스에서 designated Init을 상속한게 아니면 최소한 하나의 designated Init이 필요함 // - super 클래스의 designated init을 호출해야함 // Convenience Intializer : 간편 생성자 // - super 클래스의 designated init을 직접 호출할 수 없음 // - 반드시 동일한 클래스의 init을 호출해서 최종적으로 designated init이 호출되도록 해야 함 class Position { var x: Double var y: Double // 모든 속성을 초기화 해야한다. ..
-
swift - Initializer and Deinitializer #1 (Initializer)swift 2021. 1. 12. 15:13
Initializer 열거형, 구조체, 클래스는 모두 설계도 설계도를 기반으로 생성한것이 Instance 새로운 instance를 생성하는 것이 초기화 (Initialization) -> 모든 속성이 기본값을 가지고 있다. Initialization // 초기화 방식 class Position { // 1. 선언과 동시에 기본값 저장 // 2. initializaion에서 초기화 var x = 0.0 var y: Double var z: Double? // Optional 속성은 기본값을 저장하지 않으면 자동으로 nil로 초기화 되기 때문에 init필요 없음 init() { y = 0.0 } } class Position2 { // 이렇게 기본값을 다 넣어주고 init을 선언하지 않으면 자동으로 기본 d..
-
swift - Inheritance and Polymorphism #4 (Overloading)swift 2021. 1. 12. 14:59
overloading // 하나의 형식에서 동일한 이름을 가진 다양한 메소드를 생성할때 사용 // 동일한 스코프에 동일한 이름의 메소드가 있으면 에러 발생 // 파라미터 형식이 달라지면 err가 사라진다. // overloading Rule // 1. 함수 이름이 동일하면 파라미터 수로 식별 // 2. 이름과 파라미터 수가 동일하면 파라미터 자료형으로 식별 // 3. 이름과 파라미터, 파라미터 자료형이 동일하면 Argument label로 식별 // 4. 이름, 파라미터, 파라미터 자료형, Argument Label이 동일하면 리턴형으로 식별 func process(value: Int) { print("process Int") } func process(value: String) { print("proc..
-
swift - Inheritance and Polymorphism #3 (Any and AnyObject, Type Casting Pattern)swift 2021. 1. 12. 14:47
Any, AnyObject // 범용 자료형 // 코드의 유연성 // 남용할 경우 코드의 가독성 떨어지고 유지보수가 어려워진다. // 가능하면 사용하지 않는 것이 좋지만 // 프레임워크에서 범용자료형을 사용하는 경우가 있기 때문에 그정도만 공부해보자 // Any : 모든 형식을 저장가능 // AnyObject : 모든 클래스를 저장가능(참조형식만 저장가능) var data = 1 // Int 형식만 저장가능 // data = 2.3 // err var data2: Any = 1 data2 = 2.3 // Any가 있기 때문에 저장 가능 data2 = "str" data2 = [1, 2, 3] data2 = NSString() // Any는 참조형식 저장가능 -> 값, 참조 형식을 가리지 않는다. var ..
-
swift - Inheritance and Polymorphism #2 (Type Check Operator, Type Casting)swift 2021. 1. 12. 14:38
class Figure { let name: String init(name: String) { self.name = name } func draw() { print("draw \(name)") } } class Triangle: Figure { override func draw() { super.draw() print("🔺") } } class Rectangle: Figure { var width = 0.0 var height = 0.0 override func draw() { super.draw() print("⬛️ \(width) x \(height)") } } class Square: Rectangle { } class Circle: Figure { var radius = 0.0 override f..