SWIFT

iOS/Swift

[Swift] Subscript 알아보기 :: String에서는 subscript를 사용할 수 없는 이유

서브스크립트란 Swift에서 콜렉션, 리스트, 시퀸스 등 집합의 특정 멤버 엘리먼트에 대괄호를 사용하여 간단하게 접근할 수 있는 문법입니다. 만약 직접 서브스크립트를 구현하려면 다음과 같이 형식을 통해 구현할 수 있으며 오버로딩 또한 지원합니다. subscript(index: Int) -> Int { get { // 적절한 반환 값 } set(newValue) { // 적절한 set 액션 } } String에서 서브스크립트 사용? 결론부터 말하면 Swift에서 String은 가변의 크기를 가지기 때문에 Int기반의 인덱스 참조가 불가능합니다. 저번 포스트에서 알아봤듯이 String은 무엇으로 구성되어 있을까? [Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clust..

iOS/Swift

[Swift] AnyObject란? (런타임 시점에 결정된다)

AnyObject 정의 모든 클래스가 암시적으로 준수하고 있는 프로토콜 확인해 보기 모든 클래스가 암시적으로 준수하고 있다 하였으니 개발자가 만들어준 임의의 클래스도 해당 프로토콜을 명시적으로 채택해주지 않아도 AnyObject프로토콜을 준수하고 있는지 확인해 보자 위 코드에서 보았듯이 임의로 만들어준 클래스에서도 is연산자로 Type Checking을 수행해 봤더니 AnyObject프로토콜을 채택하고 있음을 알 수 있다. 마찬가지로 위와 같이 응용하여 서로 다른 클래스를 공통의 타입으로 묶어서 사용하게 할 수 있다. 불편한 점 AnyObject를 사용하여 타입을 지칭하게 되면 모든 클래스 타입을 공통으로 묶어서 사용할 있는 장점도 있지만 Swift의 AnyObject는 어떤 클래스의 인스턴스를 가리키는..

iOS/Swift

[Swift] String과 Substring을 메모리에서 효율적으로 관리하는 방법

SubString이란? Swift에서 문자열(String)에서 일부만 필요에 의해 분리하여 사용하기 위해 prefix(_ : )와 같은 부분 문자열(Substring)을 뽑아내는 메서드를 사용하게 됩니다. 이때 String에서 분리된 문자열은 String 타입이 아닌 Substring 타입으로 따로 정의가 되어 있는데 우리가 사용할 때 굳이 구분하지 않는 이유는 String과 Substring 모두 StringProtocol을 준수하고 있기 때문입니다. (POP의 장점?!) 그렇다면 String에서 분리한 Substring은 메모리에서 어떻게 관리될까? 다음과 예제를 같이 살펴봅시다 let greeting = "Hello, world!" let index = greeting.firstIndex(of: "..

iOS/Swift

[Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clusters

Extended Grapheme Clusters ( 확장된 문자소 클러스터 ) Swift의 String과 Character은 Unicode와 호환됩니다. Swift의 String 타입은 Unicode scalar value로 빌드되며 Unicode scalar value는 character나 수식어를 위한 고유한 21bit 숫자로 이루어져 있습니다. 확장된 문자소 클러스터(extended grapheme cluster)는 사람이 읽을 수 있는 단일 문자로 하나 이상의 Unicode scalar sequence로 구성된 됩니다. 따라서 Swift의 Character 타입의 모든 인스턴스는 하나의 확장된 문자소 클러스터(extended grapheme cluster)로 표기됩니다! let eAcute: Ch..

iOS/Swift

[Swift] Convenience initializer 알아보기

Swift의 Class에서 지원하는 initializer 1. Designated initializer 2. Convenience initializer 3. Required initializer 4. Failable initializer 5. Deinitializers Convenience initializer Designated initializer보다 적은 개수의 파라미터로 편리하게 인스턴스를 생성하기 위한 initializer로 필요해 의해 구현해 사용하며 다음과 같은 특징이 있다. - Convenience initializer는 반드시 다른 Convenience initializer를 호출하거나 Designated initializer를 호출해야 함( 궁극적으로는 Designated initial..

iOS/Swift

[Swift] CoW(Copy on Write)의 동작방식 + 메모리 주소 디버깅

Copy on Write란? Copy on Write는 원본이나 복사본에서의 실제 값 변경이 발생하기 전까지는 같은 값을 가리키고 있다가 실제 값 변경 발생 시 복사를 수행하는 방식으로 Swift는 Collection Type( Array, Set, Dictionary )과 String Type에서 CoW 복사 방식을 사용합니다. 왜 사용해야 하나요? Swift에서는 Value Type의 복사는 깊은 복사 방식을 사용하는데 Collection Type 같은 경우는 Value Type이지만 heap 영역에 생성되어 매번 깊은 복사 방식을 사용하면 높은 메모리 오버헤드를 발생시킬 수 있다. 이를 방지하기 위해 Collection Type의 경우 복사한 데이터의 수정이 발생하지 않는다면 얕은 복사와 같이 he..

iOS/Swift

[Swift] Class의 성능을 향상 시킬수 있는 방법 :: Static Dispatch

1. Static Dispatch를 사용하자 class뿐만 아니라 상속, 오버라이딩 될 필요가 없는 클래스, 메서드, 프로퍼티에 final 키워드를 붙여 Static Dispatch를 통해 성능 향상을 기대할 수 있다.( 저장 프로퍼티의 경우 오버라이딩이 원래 불가하니 의미가 없을 듯 ) Static Dispatch란? 호출할 메서드를 컴파일 타임에 결정하겠다! 런타임때 호출할 메서드를 이미 결정해 놨으니 성능이 좋다! Dynamic Dispatch란? 호출할 메서드를 런타임에 결정하겠다! Swift는 Dynamic Dispatch를 지원하기 위해 클래스마다 함수 포인터들의 배열인 vTable(Virtual Method Table)을 갖고 있다. 하위 클래스가 상위의 메서드를 호출할때 vTable을 런타..

iOS/Swift

[Swift] Class, Struct, Enum의 차이점을 알아보자

Class 참조 타입(call by reference)이다 -> 힙 영역에 생성된다 ( 주의 : 힙 영역에 참조타입만 적재되지는 않음 ) 상속(단일)이 가능하다 -> 다형성 구현에 용이하다 iOS 프레임워크의 대부분은 Class로 구현되어 있다 ( ex. UIViewController ) Swift에서는 class의 인스턴스만 Object 부르며 Object는 ARC가 메모리 관리를 해준다 Struct 값 타입이다(call by value) -> 스택 영역에 생성된다 상속이 불가능하다 Swift의 뼈대들은 대부분 Struct로 구현되어 있다 ( ex. Int, Double, String ) 멀티스레딩에 안전하다 Object가 아니기 때문에 AnyObject로 캐스팅할 수 없다 Enum 공식 문서 정의 :..

iOS/Swift

[Swift] 매우 간단하게 함수의 성능을 개선하기(메모리 관리)

func addTwoNumbers(num1: Int, num2: Int) -> Int { var result = num1 + num2 return result } 위와 같은 구조를 가진 함수의 동작 방식을 메모리 영역을 기준으로 간단하게 살펴보면 다음과 같은 순서를 가진다. 1. 임시공간을 만든다 2. num1라는 상수에 Int값을 저장한다 3. num2라는 상수에 Int값을 저장한다 4. result 변수 공간을 만든다 5. num1 + num2를 더해 임시값을 가진다 6. 임시값을 result에 할당한다 7. result의 값을 임시공간에 저장한다 8. 임시 공간의 값을 함수의 결과로 리턴시켜준다 이때 굳이 result라는 변수에 임시값을 할당하고 다시 리턴시켜줄 필요 없이 바로 임시값을 리턴시켜주면..

iOS/Swift

[Swift] Optional(옵셔널)도 결국 Enum type(열거형 타입)이다

옵셔널 정의 A type that represents either a wrapped value or nil, the absence of a value. 래핑 된 값 또는 값이 없는 nil을 나타내는 타입입니다. 왜 옵셔널 타입을 사용해야 하나 옵셔널로 선언된 변수는 초기화가 수행되지 않으면 nil로 자동 초기화 되기 때문에 런타임 에러를 방지할 수 있기 때문이다. 옵셔널 구조 enum Optional { case none // nil case some(Wrapped) // optional value } var name: String? // var name: Optional = .none var name: String? = "Terry" // var name: Optional = some("Terry") ..

테리펀트
'SWIFT' 태그의 글 목록