본문 바로가기

전체 글

Any, AnyObject Any can represent an instance if any type at all, including function types and optional types. AnyObject can represent an instance of any class type. Any는 모든 타입을 말하며, Anyobject는 클래스 타입을 말한다. AnyObject는 모든 클래스가 암시적으로 준수하는 프로토콜이다. NSCache를 사용하면서 들었던 의문점이 생겼다. UIImage는 별다른 변환 없이 사용 가능했고(UIImage는 클래스이기 때문에), URL은 AnyObject로 변환해서 집어 넣줘야 했다. AnyObject는 클래스가 암시적으로 준수하는 프로토콜이라고 정의했는데, 어떻게 URL(Struct)이 변.. 더보기
Properties Stored Properties 인스턴스의 부분으로 저장된다. 클래스와 구조체에서만 사용한다. var가 붙으면 변수이며, let이 붙으면 상수이다. 상수 구조체 인스턴스의 stored properties let someStruct = struct(...) someStruct.value = 4 // value는 변수, 에러가 발생한다. 인스턴스를 할당할 때 상수로 선언하면, 프로퍼티가 변수여도 수정할 수 없다. 이는 구조체가 값 타입이기 때문에 인스턴스가 상수로 선언되면 모든 프로퍼티가 상수로 표시된다. Lazy Stored Properties lazy 변수는 처음 사용되기 전까지는 할당되지 않으며, 호출을 받으면 메모리에 올라간다. 초기 값이 존재하지 않고, 이후에 값이 생성되기 때문에 let으로 선언할.. 더보기
Memory Management 클래스 인스턴스, 참조 타입의 값들은 heap 영역에 저장된다. 저장되는 값을 명시적으로 삭제하지 않으면, 메모리에 계속 남게 된다. 이런 상황을 메모리 릭이라고 부른다. 이를 해결하고자 애플은 MRC, ARC를 제공한다. RC (Reference Counting)컴파일 타임에, 참조에 따라서 카운트를 관리하며, 이를 사용해 메모리 관리를 처리한다. MRC (Manual Reference Counting)objc는 rc방법을 프로그래머가 직접 작성해서 처리했다. retain은 rc를 증가시킬 때 사용하며, release는 감소 시킬때 사용한다. ARC (Auto Reference Counting)컴파일 타임에 자동으로 실행되며, 정해진 규칙에 따라서 rc를 관리해준다.정해진 규칙에는 세 가지가 존재한다... 더보기
Dispatch Queue 앱 작업을 비동기식으로 수행할 수 있는 GCD 추상화 계층이다. 작업은 항상 queue에 추가된 순서대로 실행된다. Serial, Concurrent serial queue (하나의 스레드) serial dispatch queue는 한 번에 하나의 작업만 수행한다. race condition이 발생하지 않도록 특정 값이나 자원에 대한 액세스를 동기화하는데 사용된다. let serialQueue = DispatchQueue(label: "serial.queue") concurrent queue (여러 개의 스레드) On our system, you achieve concurrency by creating threads. concurrent queue는 동시에 여러 가지 작업을 수행할 수 있다. 들어오는 대.. 더보기
class, struct 공통점 프로퍼티, 메소드를 갖는 컨테이너를 말한다. subscript 구문을 사용하여 값을 접근할 수 있는 subscript를 정의한다. 초기 값을 설정하는 초기화를 정의한다. extension을 사용할 수 있다. protocol을 채택할 수 있다. Class 상속을 할수 있다. deinit을 정의할 수 있다. arc가 다루며, 해지할 때 필요한 작업을 수행한다. deinit은 자동으로 호출되며 수동으로 호출할 수 없다. 서브 클래스에 deinit이 제공되지 않더라도 슈퍼 클래스의 deinit가 항상 호출 된다. 타입 캐스팅이 가능하다. (상위 또는 하위 클래스로 형변환) reference type이다. Value type 값 복사를 할 경우에 인스턴스를 복사하면 각 인스턴스는 유니크한 데이터를 갖는다... 더보기
Bridging Swift에서 구현한 기본 타입들(Int, String)을 NS로 변형하는 과정을 bridging이라고 표현한다. as를 사용해서 타입이 Error를 NSError로 변환 가능한지 궁금했다. catch let error as NSError In the meanwhile, developers who must handle an Objective-C exception can always do so by writing a stub in Objective-C to explicitly "bridge" the exception into an NSError out parameter. This isn't ideal, but it's acceptable. 구현할 때 Error NSError로 bridging이 .. 더보기
Out of Bounds Dictionary는 '키' 값이 유효하지 않을 경우에 nil을 반환하지만, Array의 경우에는 Out of Bounds와 함께 app crash가 발생한다. array를 안전하게 사용하기 위해서 아래 코드처럼 사용할 수 있다. extension Array { subscript(safe index: Int) -> Element? { return indices ~= index ? self[index] : nil } } ~= 연산자 패턴을 비교하는 연산자이다 static func ~= (pattern: Range, value: Int) -> Bool ~= 을 사용하지 않았다면 아래 코드와 같이 표현해야되지만, ~=을 사용하면 깔끔하게 표현할 수 있다. if index >= 0 && index < endIn.. 더보기
MVC Design Pattern 글에 들어가기 앞서 mvc 이론적인 부분이 아닌, 실제로 프로젝트에 적용할 때 필요한 정보에 대해서 정리했다. Model Model -> ViewControll model에서 viewcontroller로 정보를 보내는 건 model이 viewcontroller를 알고 있는 것처럼 느껴진다. 사실 아래에 있는 KVO, Notification은 viewController가 model을 감시하는 구조이다. model은 viewController을 몰라야 한다. KVO observer에게 감시받는 속성을 갱신한다. extension Model: ViewDataSoure, Datable { func someMethod(newData: Data) { self.information = newData } ... } N.. 더보기