본문 바로가기

728x90

전체 글

(104)
String을 Subscript로 접근할 수 없는 이유 Swift의 String은 구조체이며 Character의 모음이다. 즉 Character의 배열인 셈이다. Character는 결합 시 사람이 읽을 수 있는 단일 문자를 생성하는 하나 이상의 유니코드 스칼라 시쿼스이다. 일부 문자에는 2개의 유니코드가 필요할 수 있고, 어떤 이모티콘은 4개의 유니코드가 필요할 수도 있다. 결과적으로 문자는 저장할 가변크기의 메로리가 필요하므로 인덱싱이 어렵다. 문자가 4바이트와 같이 고정된 크기의 경우 문자열에서 문자의 위치 i를 찾으려면 문자열의 시작점에서 4 * i 옵셋을 추가하면 된다. 그러나 문자가 가변 크기의 경우 해당 문자열의 시작 또는 끝에서 유니코드 스칼라를 반복하여 문자열의 인덱스를 찾아야한다. 문자열을 인덱싱하기 위해서는 String.index 를 사용..
Class의 성능을 향상 시키는 방법 Method Disptach란 호출해야하는 메서드를 결정하는데 사용되는 알고리즘으로, 대표적으로 동적 디스패치와, 정적 디스패치가 있다. Class는 동적 디스패치(Dynamic Dispatch) 메커니즘을 따른다. 동적 디스패치는 일명 런타임 디스패치 라고도 하는데 호출해야할 메서드를 런타임중 판단하는 것이다. 이때 발생하는 오버헤드로 인해 정적 디스패치에 비해 상대적인 성능 손실이 발생하게 되는데 Method Dispatch를 살펴보면서 알아보자. 해당 포스팅과 관련된 내용은 WWDC2016 영상 에서 더욱 자세하게 알 수 있다. Static Dispatch 정적 디스패치는 컴파일 타임에 호출할 메서드를 결정짓게 한다. 컴파일러는 이때 실제로 어떤 구현이 실행될지 가시성을 가지기 때문에 코드를 최적화..
initialization -3 실패할 수 있는 초기화 프로그램 init키워드 뒤에 ? 를 붙여서 실패가능한 이니셜라이저를 정의할 수 있다. 마치 옵셔널처럼! init?() { } init?(name: String) { guard name.count > 2 else {return nil} } 초기화 프로그램은 값을 반환하지 않지만 실패가능한 이니셜라이저에서 초기화 실패가 트리거 될 수 있도록 nil을 반환 하도록 할 수 있다. 성공한다면 반환값을 두지 않도록 한다. 당연히 실패가능한 이니셜라이저와 지정이니셜라이저의 파라메터명이 똑같을수 없다. init(name: String) {} init?(name: String) {} //같은 형식으는 안돼 아래 사용예시를 보면 이해가 쉽다. let wholeNumber: Double = 12345..
initialization-2 클래스 상속 및 초기화 클래스의 모든 저장속성에는 초기화 중에 초기값이 할당 되어야 한다. 이 때 초기화 대상에는 클래스가 상속받는 상위클래스의 속성 또한 포함된다. Swift는 속성 초기화를 위해 두 가지 종류의 이니셜라이저를 정의하는데, 지정 이니셜라이저(designated initializer) 편의 이니셜라이저(convenience initializer) 로 알려져 있다. 지정 이니셜라이저는 클래스의 기본 이니셜라이저이다. 모든 속성을 초기화하고 적정한 수퍼클래스 이니셜라이저를 호출하여 초기화 프로세스를 진행한다. 초기화가 발생하고 수퍼클래스 초기화 체인까지 계속되는 “funnel”지점이다. 모든 클래스에는 지정이니셜라이저가 하나 이상 있어야 하며, 경우에 따라 수퍼클래스에서 이니셜라이저를 상속함..
자주 사용하는 코드 쉽게 저장하고 가져다 쓰기 [Code Snippet] 자주 사용하는 코드를 매번 작성하는건 귀찮은 일이다. 코딩을 하면서 자동완성을 밥먹듯 쓰는것 처럼 내가 작성한 코드를 쉽게쉽게 불러오는 방법이 없을까? ㅇ Code Snippet써라. 사용하던 구형 맥을 뒤로하고 새로 맥스튜디오를 구매했다. xcode를 설치하고 코드를 작성하고 있는데 이전 맥의 Xcode에서 쓰던 snippet이 맥스튜디오 Xcode에는 정의 되어 있지 않아서 생각난 김에 포스팅한다. Xcode는 CodeSnippet기능을 제공한다. 우리가 코드를 작성할 때 도와주는 자동완성기능이 그 중 하나 인데 만약 switch를 작성한다고 예시를 들어보자. 아래처럼 switch를 다 작성하기도 전에 코드의 아래로 switch와 관련된 코드를 추천해준다. 이중 중괄호{}로 되어 있는 항목이 Code..
initialization-1 초기화는 사용할 class, struct, enum 의 인스턴스를 준비하는 프로세스다. 초기화에는 해당 인스턴스의 각 Property의 초기값을 설정하거나, 인스턴스를 사용하기 전 필요한 설정, 초기화 를 수행하는 작업을 포함한다. Objective-C 와 달리 Swift의 초기화는 반환값이 없다. Objc의 초기화 -(id)init { self = [super init] return self } Swift의 초기화 init() { //인스턴스 초기화에 필요한 내용 } 위 코드는 Swift의 가장 단순한 형태의 초기화 코드다. 매개변수가 없는 메서드와 같으며 init키워드를 사용하여 작성한다. 저장속성의 초기값 설정 class / struct는 해당 인스턴스가 생성될 때까지 모든 저장속성에 대해 적절한 ..

728x90