Array의 메모리 할당 배열은 메모리에서 특정한 영역에 연속적으로 저장됩니다. [1,2,3...]이라는 배열이 있다면 배열의 시작주소부터 연속적으로 요소들이 word단위로 저장됩니다. 1 2 3 4 5 6 이때 배열에 어떤 요소를 추가하면, 다음 주소에 다른 데이터가 저장 되 있을 수 있으므로, 메모리에서 배열을 저장 할 수 있는 공간을 찾아 할당하게 됩니다. 1 2 3 4 5 6 7 Cat 만약 어떤 요소를 추가할때마다, 이같이 메모리의 특정영역에서 저장할 공간을 찾는다면 성능적으로 문제가 있을 수 있습니다. 그래서 Swift에서 배열은 배열보다 더 큰 양의 메모리 공간을 예약합니다. 이때 예약된 공간도 다 사용하게 된다면 현재 배열의 배수의 크기만큼 공간을 찾아 예약을 하게 됩니다. 다만 무조건 배..
결론부터 말하자면 lazy와 weak를 동시에 사용할 경우 객체가 즉시 해제되어서 정상적으로 작동할 수 없으므로 컴파일 오류가 뜬다. lazy 프로퍼티 lazy 프로퍼티는 처음 객체가 생성될때 초기화 되는 것이 아닌 해당 프로퍼티가 사용될 때 초기화 되는 프로퍼티 weak 해당 프로퍼티가 약한 참조로 Reference Counter를 올리지 않게 되며, 해당 객체가 런타임 도중 할당이 해제되면 해당 프로퍼티는 nil값으로 변경된다. lazy 와 weak를 같이 쓴다면 class B { var hello = "Hello" } class A { lazy weak var b: B? = B() func asd() { print(b!.hello) } } let a = A() 이런 코드가 있다고 해보자. 여기서 A..
프로토콜은 자기 자신을 채택하고 있지 않다 protocol P {} struct S: P {} let arr:[P] = [S()] func genericFunc(a: [T]) -> [T] { return a } genericFunc(a: arr) // Error: Type 'any P' cannot conform to 'P' 프로토콜은 자기 자신을 채택하고 있지 않다. 따라서 제네릭의 타입 제약을 프로토콜을 채택한 것으로 제약을 걸어 두었을 때, 컴파일 시 오류가 뜬다. 즉 프로토콜 P는 프로토콜 P를 채택하고 있지 않아서 제네릭 제약조건인 P를 채택한 타입에서 걸려서 오류가 발생한다. protocol P {} struct S: P {} let arr:[P] = [S()] func nonGenericFu..
왜 사용하는가?프로퍼티에 접근할 때, 사람들은 공통적인 패턴으로 접근 함lazy를 통한 value initalizedThread-local stroage를 사용할 때UserDefaults등등... 어떤 프로퍼티에 접근할때 get이나 set를 사용하지만 코드가 반복될 때가 있는데 property wrapper를 통해 재사용성을 높이고 중복을 없앨 수 있음 사용법@propertyWrapper struct TwelveOrLess { private var num: Int = 0 var wrappedValue: Int { get { return num } set { num = min (newValue, 12) } } init(wrappedValue: Int) { self.wrappedValue = wrappedV..
러닝앱에서 러닝을 끝내면 러닝 결과를 보여주는 화면이 나타난다. 이때 이 화면에서 지도와 함께 뛴 루트를 보여준다. 이때 지도를 넣고 오버레이를 그리는 방식으로 구현해도 되지만, 지도는 많은 자원을 사용한다. 단순히 경로를 보여주는 역할을 하기에는 자원 사용률이 높아서 과하다고 생각했고, 이를 이미지로 만들어서 보여줄 수 있는 방법이 없을까 했는데, MKMapSnapshotter라는게 있어서 사용해 보았다. MKMapSnapshotter 지도와 지도의 컨텐츠를 이미지로 캡처해 주는 기능을 제공하는 클래스 입니다. 지도를 보여주지만, 상호작용이 필요하지 않을때 사용하는 것을 추천하고 있습니다. 지도를 캡처할 때, 오버레이나 annotation 까지 같이 표시해주지 않습니다. 따라서 캡처한 이미지 위에 오버..
함수의 인자값 전달은 기본적으로 call by value로 동작한다. 따라서 함수 내부에서 인자값을 변경하더라도 원래 값은 변경 되지 않기도 하고, 함수의 파라미터는 상수(let)로 선언되어있다. 따라서 아래와 같이 함수 내부에서 파라미터 값을 변경 하려고 하면, 오류가 발생한다. func changeValue(input: Int) { input = 10 } 하지만 class타입의 경우, class타입 내부에 있는 프로퍼티는 변경이 가능하다. class A { var a = 10 } func changeValue(input: A) { input.a = 20 } let classA = A() changeValue(input: classA) print(classA.a) // 20 출력 classA를 생성 할..