Programming/Swift(iOS)
-
Swift Generic - 1Programming/Swift(iOS) 2021. 4. 6. 14:05
모든 객체 지향 언어에는 Generic이라는 개념이 존재합니다. 제너릭을 지원하므로써, 동일한 로직이 갖고 있는 함수에 대해서 중복을 제거할 수 있습니다. 한번만 만들면되고, 아직 작성되지 않는 다양한 타입에 대해서도 대응이 가능합니다. 또한, 제너릭을 사용하므로써 Any 타입이 아니기때문에 실행시간에 다운 캐스트와 같은 불필요한 동작도 필요하지 않습니다. 오버로딩은 함수를 중복으로 구현하고, 전달인자를 다르게 하는것이고, 제너릭은 하나의 함수를 다양한 타입이 지원가능하도록 만드는 것입니다. Generic의 구현 방식 1) 컴파일러가 코드를 생성하는 방식 => C++, C#, Swift : 타입 안정성 뿐만 아니라, '컴파일 타임 다형성'을 구현하는 것이 가능하다. 2) Any Type으로 생성하고, 컴..
-
Swift 오류처리 -3Programming/Swift(iOS) 2021. 4. 6. 13:10
Error처리를 한 군데에서 하면 중복된 코드를 방지할 수 있어 가독성을 높일 수 있습니다. Singleton - 'default' => swift에 default keyword가 지정되어 있어 quota로 다르다는것을 표시 - shared : private로 제한을 걸어 생성을 불가능하게 한다. struct ErrorHandler { static let `default` = ErrorHandler() func handle(_ error:Error) { print(error) } } 타입을 생성할 때, Data의 유효성을 미리 검증해 볼 수 있다면 이후의 오류 처리를 줄일 수 있습니다. 에러 원인이 2개 이상일 경우 오류 처리를 하는 것이 좋고, 단일이라면 Optional 처리를 하는것이 편리합니다. 1..
-
Swift 오류처리 - 3Programming/Swift(iOS) 2021. 4. 6. 11:22
Objective - C의 전통적인 에러 처리인 'NSError'를 이용한 방법입니다. NSError를 extension으로 구현 한 뒤에, 각 종 처리를 추가해주면 됩니다. enum ApiError: Error { case network(String) case client(String) case server } struct User { let login: String let company: String } extension ApiError { var nsError: NSError { return NSError(apiError: self) } } func getGithubUser(login: String) throws -> User { if login == "root" { // throw ApiError..
-
Swift 오류 처리 - 2Programming/Swift(iOS) 2021. 4. 6. 09:51
만약 데이터를 더하다가 오류가 났을때는 이미 추가된 데이터는 어떻게 해야될까요? 1, 이전 데이터로 돌린다. 2. 오류 이전까지만 추가한다. 개발자 혹은 기획이 어떻게 되냐에 다르겠지만, 대부분은 1번을 선택 할 것입니다. 오류 가능성이 있는 연산이 수행되었을 때, 오류가 발생하게 되면, 오류 발생 이전의 객체 상태로 오류 발생 이후의 상태는 동일해야 한다. => 예외 안정성 아래 코드는 append를 하다가 예외가 발생합니다. 과연 어떤 결과가 나올까요? enum LogError:Error { case invalidValue } struct Log { var values:[String] = [String]() mutating func append(messages:[String]) throws { for..
-
Swift 오류 처리 - 1Programming/Swift(iOS) 2021. 4. 6. 09:38
Swift에는 오류를 처리할 수 있는 방법들이 많이 있습니다. Error Protocol을 구현해주면 되는데요. 에러는 상호 베타적이기때문에, 한 에러가 발생하면 다른 에러는 발생하지 않아야합니다. -> Enum을 가지고 구현하면 편합니다. 추가적인 정보가 필요한 경우에는 struct나 class도 가능합니다. 에러에 대한 정보는 함수 위에 미리 넣어주는게 좋습니다. (Command + option + /) enum ParseLocationError:Error { case invalidData case network(String) case locationDoesNotExist } struct Location { let latitude:Double let longitude:Double } /// 유요한 위..
-
Swift 상속Programming/Swift(iOS) 2021. 4. 3. 00:00
일반적인 상속은 다른 곳에서 많이 다루니, 여기서는 상속에서 좀 특이한것들 다뤄볼까 합니다. static 메서드, 프로퍼티는 상속 가능할까? class Car { static func foo() { print("Car foo") } } class Truck:Car { override static func foo() { print("Truck foo") } } 위와 같이 쓰게 되면 "Cannot override static method" 를 발생 시킵니다. static method는 상속이 불가능하다는 메세지입니다. 이 문제를 해결하기 위해서는 "class" keyword를 사용하면 됩니다. class Car { class func foo() { print("Car foo") } } class Truck:..
-
Swift 초기화 메서드Programming/Swift(iOS) 2021. 4. 2. 21:58
1. Struct 초기화 - struct는 초기화 메서드가 가지고 있는 프로퍼티에 대해서 자동으로 생성됩니다. - 따라서 별도로 초기화 메서드를 만들 필요가 없지만, - 만약 사용자 초기화 메서드를 작성하는 순간, 시스템에서 제공하는 자동 초기화 메서드는 더 이상 사용할 수 없습니다. - 사용자 초기화 메서드와 시스템 초기화 메서드를 동시에 사용하도 싶다면, "extension"에 사용자 초기화 메서드를 구현하면 됩니다. //CaseIterable protocol을 만족하므로써 enum이 제공하는 모든 case를 얻어 올 수 있는 //allCases 메서드 사용가능 enum Color:CaseIterable { case red, blue, white, crayon } struct Car { let nam..
-
Swift Optional - 2Programming/Swift(iOS) 2021. 4. 2. 21:34
이번시간에는 Optional을 활용하는 예제를 해보겠습니다. 고객 등급을 나타내는 Membership enum이 있습니다. struct User는 Membership을 Optional변수로 가지고 있습니다. -> Membership이 있을 수도 있고, 없을 수도 있습니다. 첫 객체는 .gold 정보가 있는 User이며, 두번째 객체는 nil을 가집니다. 이때 if let으로 정보를 가져오고, switch~case를 통해서 값을 출력해보면 현재 정보를 알 수 있습니다. //멤버십 레벨을 나타내주는 enum enum Membership { case gold case silver } //User는 멤버십을 가지고 있고, 이 멤버십은 있을수도 있고, 없을 수도 있습니다. struct User { let memb..