swift
-
swift - Protocols #2 (Property Requirements)swift 2021. 1. 12. 18:13
// 프로토콜에서 속성을 선언하고 형식에서 속성 요구사항을 구현해보자 // 형식에서는 가변성에따라 var와 let을 사용하는데 protocal에서는 무조건 var -> 이건 선언하는 멤버가 속성이라는 것을 표현함 {get, set 이거 두개가 가변성을 나타낸다.} // get protocol Figure { var name: String { get } } struct Rectangle: Figure { let name = "Rect" } struct Triangle: Figure { // get만 포함되어 있다고해서 읽기전용인 let으로 해야하는 것은 아님 var name = "Triangle" } struct Circle: Figure { // computed property로 표현해도 됨 var na..
-
swift - Protocols #1 (Syntax)swift 2021. 1. 12. 18:04
Protocols - 형식에서 기본적으로 제공하는 멤버 목록 - 프로토콜은 형식에서 구현되어야 하는 멤버 목록이 있다. , 실제 구현은 프로토콜에 선언되어 있지 않다. - class와 struct같은 형식들이 protocal에 잇는 멤버를 구현한다. -> 프로토콜을 채용한다. -> 프로토콜을 채용하면 프로토콜에 있는 필수 멤버들을 반드시 구현해야함 Syntax - protocal 키워드로 선언 - uppercamelcase로 선언 - { } 사이에는 멤버 선언만 (구현 x) - 상속을 지원한다 (class 상속과 동일) - 다중 상속을 허용한다. (class는 단일 상속만 허용) protocol Something { func doSomething() } // 프로토콜 채용 // 클래스가 다른 클래스를 먼..
-
swift - Extension #5 (Adding Subscript)swift 2021. 1. 12. 17:30
Adding Subscript extension String { // 문자열 기본 인덱스는 정수 인덱스를 인덱스로 전달할 수 없다 반드시 문자열 인덱스를 전달해야함 subscript(idx: Int) -> String?{ guard (0.. Int? { let cal = Calendar.current return cal.component(component, from: self) } } let today = Date() today[.year] today[.month] today[.day]
-
swift - Extension #4 (Adding Initializer)swift 2021. 1. 12. 17:09
Adding Initializer extension Date { init?(year: Int, month: Int, day: Int) { let cal = Calendar.current var comp = DateComponents() comp.year = year comp.month = month comp.day = day guard let date = cal.date(from: comp) else { return nil } // Date는 구조체로 작성되어 있기때문에 self에 저장가능 self = date } } Date(year: 2014, month: 4, day: 16) extension UIColor { convenience init(red: Int, green: Int, blue: Int)..
-
swift - Extension #3 (Adding Method)swift 2021. 1. 12. 17:02
Adding Method extension Double { func toFahrenheit() -> Double { return self * 9 / 5 + 32 } func toCelsius() -> Double { return (self - 32) * 5 / 9 } static func converToFahrenheit(from celsius: Double) -> Double { return celsius.toFahrenheit() } } let c = 30.0 c.toFahrenheit() Double.converToFahrenheit(from: 30.0) extension Date { func toString(format: String = "yyyyMMdd") -> String { let priva..
-
swift - Extension #2 (Adding Properties)swift 2021. 1. 12. 16:54
Adding Propert extension으로 추가할 수 있는 속성은 computed propert로 제한된다. 저장 속성이나 프로퍼티 옵저버를 추가하는 것은 불가능, 형식에 존재하는 속성을 오버라이딩 하는것도 불가능하다. extension Date { var year: Int { let cal = Calendar.current return cal.component(.year, from: self) } } let today = Date() today.year extension Double { // 여기서 self는 Double 형식의 인스턴스에 저장된 값 밑에서 45를 넣었으니까 45 var radianValue: Double { return (Double.pi * self) / 180.0 } var ..
-
swift - Extenseion #1 (Syntax)swift 2021. 1. 12. 16:48
Extension 형식을 확장하는데 사용한다. -> 속성, 메소드, 생성자들을 형식에 추가하는 것 extension으로 확장할 수 있는 대상 extension은 형식 선언에 새로운 멤버를 추가하는 것이 아니라 새로운 멤버는 별도의 코드조각으로 구현하고 형식과 연관시켜서 기존 멤버와 함께 사용하는 것 형식 선언이 포함되어 있는 코드를 수정할 수 없는 경우에도 문제없이 사용 가능 Int, String같은 건 실제로 struct로 구현되어 있는데 애플이 제공하는 libraray를 직접 수정하는 것은 불가능 하지만 extension으로 추가해서 사용하는 것은 가능 멤버를 추가하는 것은 가능하지만 overriding은 불가능 만약 overriding이 필요하다면 상속을 통해 구현해야 한다. struct Size ..
-
swift - Initializer and Deinitializer #6 (Deintializer)swift 2021. 1. 12. 16:26
// 소멸자 // 인스턴스가 메모리에서 제거되기 전에 부가적인 정리작업을 구현하기 위해 사용 // 리소스 정리 코드를 작성 // class 전용 코드 // deinit은 하나만 구현가능 // 자동으로 메모리에서 없어질때 호출된다. class Size { var width = 0.0 var height = 0.0 } class Position { var x = 0.0 var y = 0.0 } class Rect { var origin = Position() var size = Size() deinit { print("deinit \(self)") } } var r: Rect? = Rect() // 메모리에 있던 rect 인스턴스 정보가 제거된다. r = nil // 파일연결이나 네트워크 연결처럼 자동으로 ..