Programming/Swift(iOS)
-
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()..
-
Swift Property - 1Programming/Swift(iOS) 2021. 4. 1. 22:57
프로퍼티는 접근자의 메소드를 자동으로 생성하는 기술이라고 볼 수 있습니다. 예를 들면, positionX의 값을 구하는데 있어서 x의 좌표가 필요하다고 합니다. 그렇다면 아래와 같이 get블럭 안에서 계산된 값을 전달 받을 수 있습니다. 이를 계산 프로퍼티 혹은 연산 프로퍼티라고 합니다. let x:Int = 10 let positonX:Int { get { return x + 10 } } 단순히 var로 된 변수를 선언하는 것은 저장 프로퍼티라고 합니다. swift에서는 상수, 변수냐에 따라서 get, set을 사용하는 범위가 달라집니다. let -> get var -> get, set let은 한번 정해지면 변할 수 없는 값이기 때문에 set을 할 수가 없습니다. 또하느 계산프로퍼티는 어떻게 보면 프..
-
Swift Enum - 4Programming/Swift(iOS) 2021. 4. 1. 22:33
이번에는 enum rawValue를 이용해보겠습니다. 아래 코드의 문제는 뭘까요? switch의 case에 문자열로 구분하므로, 실패(default)에 대한 구현을 항상해야됩니다. 반환값이 String Optional이므로 호출부에서 if let ~으로 한번 더 처리해야된다. 대문자를 따로 해줘야 한다. func getAvatarImageFileName(for fileExtension:String) -> String? { switch fileExtension.lowercased() { //문자열에 대한 switch ~ case 처리는 현재 case 이외의 값도 올 수 있으므로 default를 추가해야된다 case "jpg", "jpeg": return "avatar.jpg" case "bmp": retu..
-
Swift Enum - 3Programming/Swift(iOS) 2021. 4. 1. 21:15
이번에는 enum을 가지고 struct나 class를 대체하는 것을 공유하려고 합니다. 아래 두 struct를 보면, 중복된 속성이 존재합니다. struct User { let email:String let password:String let joinDate:Date var level:Int var exp:Int } struct Admin { let email:String let password:String let joinDate:Date var logs:[String] } 중복된 속성을 해결하려면 어떻게 해야될까요? 클래스의 상속을 이용하면 부모클래스에 공통 속성을 두고, 자식 클래스에서 사용하면 됩니다. 하지만 부모 클래스에 변경이 있을 때 자식 클래스에서도 변경을 해줘야 되므로 기존 설계 구조를 계..
-
Swift Enum - 2Programming/Swift(iOS) 2021. 4. 1. 20:58
enum 두번째 예제입니다. 아래 예제에서 arr를 순회하면서 출력하려면 arr의 요소에 따라서 분기하는 처리가 필요합니다. 또한 'Any' 타입이기때문에 switch ~ case에서 항상 'default'가 붙어야 합니다. let arr:[Any] = [ Date(), "Hello", 100, 3.14] for element in arr { switch element { case let v as Date: print("Date - \(v)") case let v as String: print("String - \(v)") case let v as Int: print("Int - \(v)") case let v as Float: print("Float - \(v)") default: print("unSu..
-
Swift Enum - 1Programming/Swift(iOS) 2021. 4. 1. 20:53
지금부터는 swift에서 사용하는 enum타입에 대한 공부를 해볼까 합니다. swift에서의 enum의 쓰임새는 다양합니다. c와는 쓰임새가 정말 많이 달라서 처음에는 어렵게 느껴집니다. 제가 보는 책에서 swift enum을 유용하게 사용할 수 있는 경우를 찾아봤습니다. 제한된 선택지를 주고 싶을때 정해진 값 이외에는 입력을 받고 싶지 않을때 예상된 입력값이 한정되어 있을 때 -> enum은 하나를 선택하면 다른 하나를 선택 못하기때문에 Error 처리에서도 자주 등장합니다. Swift에서 자주 사용하는 Optional도 Enum으로 구현되어 잇습니다. enum School { case primary case elementary case middle case high case university } /..