swift
-
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..
-
Swift Optional - 1Programming/Swift(iOS) 2021. 4. 2. 08:19
swift에서 Optional은 '값이 있을 수도 있고 없을 수도 있다.' 입니다. Optional은 nil을 안전하게 다루는 방법이라고 할 수 있습니다. 간단한 String optional입니다. var str1:String? = nil var str2:Optional = "" print(str1) print(str2) print(str1?.isEmpty) print(str2?.isEmpty) /* 결과 nil Optional("") nil Optional(true) */ 코드에서도 보듯이 optional의 nil과 isEmply와는 다릅니다. str1과 str2의 isEmpty의 결과를 잘 보세요. nil과 true가 나옵니다. 즉 optional에 nil이면 아예 값을 할당 조차 안했다는 얘기가 됩..
-
Swift Property - 3Programming/Swift(iOS) 2021. 4. 1. 23:42
프로퍼티에는 감시자라는게 있습니다. 값이 변경될 때, 특정 행동들을 수행하도록 만들 수 있습니다. 저장 프로퍼티에 한해서만 사용을 할 수 있고, willSet / didSet이 있습니다. - willSet 값이 변경되지 직전에 호출 속성이 변경될 것이라는 것을 외부에 알릴때 많이 사용 -didSet 값 변경 후에 호출 된다. 값의 변경 이후에 추가적으로 수행해야되는 작업이 있을 경우 이와는 별도로 defer block도 있습니다. 함수가 끝나고 난 이후에 무조건 실행되는 block입니다... struct User { var email:String { didSet { //만약 emil의 주소가 올바른지 체크하고 싶다.. //예를 들어 이메일의 입력이 ". hello@gmail.com "이다.. //공백 제..
-
Swift Property - 2Programming/Swift(iOS) 2021. 4. 1. 23:11
그렇다면 프로퍼티에서 적합하지 않은건 무엇일까요? 오래 걸리는 계산등은 프로퍼티에서 적합하지 않습니다. 이미지를 다운받고 , 그리는 코드가 있다고 해봅시다. 이때, 2번 연속 draw()를 호출하게 되면 ...image를 접근할 때마다 다운로드를 받아야합니다. struct UIImage { let url:String } struct Image { let url:String //계산형 프로퍼티는 시간이 오래걸리는 작업에 적합하지 않다. var image:UIImage { print("Donwload image from \(url)") sleep(1) return UIImage(url:url) } //draw를 할때마다 다운로드 받는다...lazy를 이용해서 처음 접근할때만 초기화하고, func draw()..