본문 바로가기

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는 해당 인스턴스가 생성될 때까지 모든 저장속성에 대해 적절한 ..
Method( Instance Method, Type Method) 특정 유형과 연관된 함수(Function)를 메서드라 한다. :Class, Struct, Enum과 같은 유형과 연괸된 작업(기능)을 말한다. Method와 Function의 차이 흔히 말하는 함수와 메서드의 차이는 클래스 내부에 정의한 함수를 메서드라고 하며, 이런 메서드와 별개로 독립적인 기능을 함수라 한다. 또 메서드는 객체의 속성을 다루기 위한 행위를 정의한 것이라는 의미도 포함되어 있다. 메서드의 종류 인스턴스 메서드(Instance Method) 타입 메서드(Type Method) 1. Instance Method 인스턴스 메서드는 특정 클래스, 구조 또는 열거형의 인스턴스로 접근 할 수 있는 메서드를 말한다. 인스턴스 메서드는 인스턴스 속성에 엑세스하고 수정하는 방법을 제공하거나, 인스턴스 ..
백그라운드모드에서 위치정보 가져오기 (BackgroundModes + LocationUpdates) 이번 게시물은 최근 프로젝트를 진행하면서 접한 백그라운드 모드에 대해 간단히 경험을 기록한다. 많은 삽질이 있었으니 중간에 잘못된 정보가 보인다면 댓글로 지적해주세요. 시작 백그라운드에서 네트워크 정보가 변경되고 변경된 네트워크(WiFi)명이 내가 원하는 네트워크와 일치하는지 확인 하고 LocalNotification을 발생시키는 기능을 만들고 있었다. 모두 알다시피 앱이 백그라운드상태로 진입하게 되면 보통의 일반적인 기능들은 정지된다. 당장 타이머 하나를 생성해서 1초마다 log를 출력하도록 해보자. 로그를 확인했다면 백그라운드로 앱을 내려보자. 잘 나오던 로그가 멈춘것을 볼 수 있다. Wi-Fi 를 감지하는 것 또한 위와 별 다를게 없으니 어떻게해야 백그라운드에서 동작을 수행할 수 있을지가 맞닥들인 ..
Swift의 Property 저장 속성 Stored Property - 가장 단순한 형태의 속성 - 일반적인 인스턴스의 상수 또는 변수 - 변수 저장은 var, 상수 저장은 let init과 함께 인스턴스를 초기화 할 때 저장속성에 기본값을 제공할 수 있다. struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, lenth: 3) rangeOfThreeItems.firstValue = 6 이 때 rangeOfThreeItems가 let으로 할당 된 인스턴스라면 FiexdLengthRange의 firstValue의 속성이 var(변수)여도 수정이 불가하다. 이것은 값 유형인 s..
Timer로 작업 예약하기 타이머는 실행되어야 할 작업들을 특정 시간 간격을 두고 실행할 수 있게 해준다. 타이머는 RunLoop와 동작하며, 타이머를 효과적으로 이해하려면 RunLoop 가 어떻게 동작하는지 알아야 한다. (정리 필요) 타이머로 작업 예약하는 방법 1. 타이머의 클래스메서드를 사용하여 타이머를 생성하고 현재 런 루프에 자동 등록 timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { t in self.updateCount() }) timeInterval: 타이머로 지정된 작업의 시간(초)간격. 만약 0.0초를 사용하려 한다면 0.1로 사용하라고 한다. repeats: 타이머의 반복 여부. 무효화될 때까지 지정한 Interval 로 blo..

728x90