iOS/Swift (10) 썸네일형 리스트형 Concurrency - 기초 동시성(Concurrency) 프로그래밍비동기 프로그래밍 이해1. 비동기 처리가 필요한 이유네트워크 통신과 비동기 처리네트워크 통신(서버와 통신)은 부하가 많이 걸리는 일임. 예를 들어 서버로부터 데이터를 가져와 테이블 뷰로 표현한다고 가정을 해보자. 만약 비동기 처리가 되어있지 않다면 테이블뷰를 스크롤 할 때마다 버벅이게 될 거임! 🤔왜 그럴까? 비동기 처리를 하지 않으면 UI관련 메커니즘이 제대로 동작하지 않기 때문?? 비동기 처리를 하지 않으면 메인 쓰레드에서 모든 작업을 처리함. 그러나 작업의 길이가 길어지게 되면서(네트워크 통신) 과부하가 걸리게 되는거임. 그래서 메인 쓰레드는 UI작업만 남기.. Type Erasure, Opaque Type Type Erasure에 대해 살펴보도록 하겠습니다.이걸 공부하는 이유는 제가 swiftUI를 공부하면서 뷰 만들 때 항상 some 키워드가 앞에 붙자나요.맨날 무의식적으로 사용하다가 어느순간 이게 근데 뭐하는건데 왜 붙지 생각이 들어서관련 내용을 정리해보도록 하겠습니다! 아래와 같이 ContentView를 그리는 View가 있을 때 View 타입 앞에 some 키워드가 붙습니다.struct ContentView: View { var body: some View { Text("Hello, world!") .padding() }} some은 computed property또는 함수의 구체적 return Type을 숨기는 것(불투명한 타입)을 제공할 수 있음(ret.. Access Control(접근제어자) 안녕하세요!! 정~말 오랜만에 글을 씁니다!!!한동안 이래저래.. 나태하게 지냈는데 다시 맘잡구 천천히 시작해보겠습니다! 오늘은 비교적 간단한 내용을 가져왔는데여.바로 접근제어자입니다. Swift 접근제어자에 대해 정리해 보겠습니다. 저는 앱을 만들때 보면 접근 제어자를 default 아니면 private 정도만 쓰게 되더라구요. 접근제어자를 사용하는 이유는 모듈, 소스파일 등 요소의 접근을 제어하기 위해서잖아요? (객체지향의 은닉화 구현.. 뭐 그런거?)뭐 접근을 제어해서 상세 구현을 숨기고, 불필요한 접근을 막아서 코드를 좀 더 좋게 만들 수 있따 그런거잖아여.이렇게 두루뭉실하게만 알고 있기도 하고, 너무 의식하지 않고 생각없이 사용해온 것 같아서 좀 더 세분화해서 접근 관리를 할 필요가 있지 않나라.. [weak self] 왜 쓸까!! 어느순간부터 개발을 할 때 [weak self] 를 거의 무조건 붙히는데여 메모리 누수와 참조 문제와 관련이 있다고 공부했었던 기억이 있는데 잘 기억도 안나고.. 그냥 무의식적으로 항상 넣고 있길래 정리를 한번 해보려고 합니다. 여기서는 메모리에 관한 부분은 다루지 않고 참조에 관한 내용만 다뤄보도록 하게씀 (ARC 이런건 따로 정리해 볼 예정) 클로저 내부에서 외부 변수를 사용하게 되면 변수를 클로저 내부적으로 저장을 하고, 이때 해당 변수의 타입(값, 참조)에 상관없이 참조타입으로 memory capture를 하게 됩니다. 참조에 대해서 코드로 설명을 더 해보겠음! var a = 5 let closure = { print(a) } print(a) // 5 a = 10 closure() // 10 위와.. Metatype(.self, .Type, .Protocol) 오늘 강의를 듣는데 .self가 나오면서 메타타입이 나오는거에요 그래서 어 그게 머지? 하고 찾다가 시작된 블로그…글..임미다.. 글을 쓰기전에 앞서서… 소들이님이랑 수진날진님.. 블로그로 이해한 후 작성하려 했으나…. 쓰다보니까 따라쓰기가 되어 가더라구요 ㅠㅠ(너무 잘 정리하셔따..) 그래서 혹시 보시는 분들은 ㅇ아래 링크타고 들어가서 보시면 훨~씬 이해가 잘 되실껍니다!!! Swift) Metatype(.self, .Type, .Protocol) 정복하기 (1/2) Swift) Metatype(.self, .Type, .Protocol) 정복하기 (1/2) 안녕하세요, 소들입니다 :D 오늘은 바로 2월 1일 설날이랍니다 눈 뜨자마자 갑자기 Metatype 포스팅이 하고 싶어져서 포스팅을 하고 있는 사.. Swift Xcode 프로젝트명 바꾸기 사실 이거에 대해서는 쓸 생각이 없었는데…. 내가 이문제를 겪었기 때문에 써보도록 하겠음!! 과제를 제출할 때 일련번호를 적어야 하는데 다 제출하고 pr날리고 보니까 일련번호가 전에랑 바뀌었던 거임!! 그래서 디렉토리에 일련번호를 부랴부랴 바꿔서 다시 제출은 했는데 보니까 프로젝트명은 아직 그래도인 거임 그냥 이름 바꾸니까 에러가 뜨면서 실행이 안되더라구요,,,? 그래서 찬찬히 찾아보면서 바꿀려고 함! 나 같이 무대포로 바꾸려다 에러를 만나시는 분들을 위해서… 써보겠음미다… 모두 화이팅…! XCode 프로젝트명 바꾸기!!!!!!! 1. 우선은 프로젝트의 이름을 바꿔야 함 다들 아시겠지만 엔터를 누르면 이름을 바꿀 수 있자나여 우선 최상단의 프로젝트의 이름을 바꿔줍니다. 그럼 이렇게 이름바꿀 프로젝트에 포.. Swift Generic이란?? 제네릭 제네릭은 유연하고 재사용 가능한 함수와 타입의 코드를 작성하는 것을 가능하게 해 줌. → 중복을 피할 수 있습니다! 사실 우리가 사용하는 것들중 많은 것들이 제네릭으로 되어 있는데 대표적으로 배열, 딕셔너리가 있음! func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } var someInt = 3 var anotherInt = 107 swapTwoInts(&someInt, &anotherInt) print("someInt is now \\(someInt), and anotherInt is now \\(anotherInt)") // Prints "someInt is now 107, and.. Instance Method / prefix(_:), suffix(_:) # Array의 인스턴스 메소드 prefix / suffix 사용하기!!! 저는 그냥 간단하게 기능만 작성해보려고 했는데... 매개변수에 따라서 종류가 생각보다 많더라구요...? 그래서 그냥 하는김에 와장창 다 정리해보려고 합니다!! # prefix / suffix의 반환 타입 prefix와 suffix는 Array의 인스턴스 메서드입니다. 따라서 반환되는 값의 타입을 Array라고 생각하실 수 있는데 사실 ArraySlice라는 타입을 반환합니다. let arr: [Int] = [1, 2, 3] print(type(of: arr)) print(arr) //Array //[1, 2, 3] print(type(of: arr.prefix(1))) print(arr.prefix(1)) print(type(of.. Initializer / init(repeating:count:) repeating과 count를 이용하여 초기화하는 방법!!!!! init( repeating repeatedValue: String, count: Int ) 이는 String이나 Array에서 사용할 수 있는 초기화 방법입니다 Parameter의 종류는 다음과 같습니다. repeatValue 반복될 string 문자열을 입력합니다. count 입력한 숫자 Int 만큼 repeatValue의 문자열을 반복합니다. 다음은 Initializer 사용의 예시입니당. let s = String(repeating: "ab", count: 10) print(s) // Prints "abababababababababab" let fiveZs = Array(repeating: "Z", count: 5) print(fi.. Function / print(_:separator:terminator:) print를 할 때 separator, terminator를 이용하여 출력하는 방법! func print( _ items: Any..., separator: String = " ", terminator: String = "\n" ) Parameter의 종류는 다음과 같습니다. items print할 아이템 입력 separator 각각의 아이템들 사이에 출력할 문자열을 의미. 기본값은 스페이스바(" ")입니다. terminator 모든 아이템들을 출력한 이후 출력할 문자열을 의미 기본값은 개행("\n")입니다. 다음은 함수 사용의 예시입니당. print("One two three four five") // Prints "One two three four five" print(1...5) // Prints .. 이전 1 다음