근본으로 돌아가자(3)-View Layout
·
SWIFT개발일지
정말정말정말 오랜만에 글을 쓰는 것 같네요... 아카데미가 끝난 이후 개인 프로젝트도 몇 개 하고, 상하이 여행도 갔다 오고, 게임도 하고... 쫌 놀았어요 😅 정신줄 놓고 있었는데 한 동아리 면접을 보러 갔다가 정신을 차리게 되었습니다! 이전까지는 "나 정도면... 못하진 않지?" 했다가 그냥 탈탈 탈곡기마냥 털렸거든요... 정말정말정말 부끄러웠던 순간이었습니다... 그래서 다시 근본으로 돌아가자! 하고 WWDC19의 Building Custom Views with SwiftUI를 공부하게 되었습니다!https://developer.apple.com/videos/play/wwdc2019/237/ Building Custom Views with SwiftUI - WWDC19 - Videos - App..
근본으로 돌아가자(2) - animation & iOS 17에서 바뀐것들
·
SWIFT개발일지
WWDC23에서 애플은 SwiftUI를 개발한 핵심 동기가 바로 앱에 애니메이션을 쉽게 추가할 수 있도록 하는 것이라고 스스로 밝힐 정도로, 애니메이션은 SwiftUI의 핵심 요소입니다. 이 글에서는 WWDC23의 세션 "Explore SwiftUI Animation"을 상세히 분석하고, SwiftUI에서 애니메이션이 어떻게 작동하는지 심층적으로 살펴보겠습니다.https://developer.apple.com/videos/play/wwdc2023/10156/struct AnimationView: View { @State private var selected = false var body: some View { Image("bell.fill") .resizable() .frame(w..
View Modifier
·
SWIFT개발일지
A modifier that you apply to a view or another view modifier, producing a different version of the original value. - 기존의 뷰 또는 다른 view modifier에 적용시켜 또 다른 버전을 만들 수 있는 modifier이다. 즉 기존의 뷰 또는 modifier에 추가적으로 꾸며줄수 있다. 그런데 여기서 궁금한점... 왜? 굳이 커스텀해서 뷰 모디파이러를 하는가 그자체로 바꾸지 않구? - 앱 전체적으로 쓰이는 스타일이 있다면 일일이 수정해주려면 코드를 일일이 추가해주어야하기에 struct RedBorder: ViewModifier { func body(content: Content) -> some View { co..
KeyChain & 암호화
·
iOS
UserDefaults의 치명적 보안 약점iOS개발자로서 데이터를 안전하게 관리하는 것은 필수적인 역량입니다. UserDefault는 설정같이 가벼운 데이터를 저장하는데 적합했지만 비밀번호같은 민감한 데이터를 저장하면 보안 위협이 큽니다.왜UserDefault는 위험할까?UserDefault는 key -value 형태로 데이터를 저장하여 plist 파일로 즉 샌드백스 내에 존재합니다. 즉 앱이 삭제되면 데이터도 사라지는데 .UserDefaults는 암호화되지 않아있음. 예를들어 탈옥된 디바이스에서 중요 정보를 빼갈 수 있는거져 // 이렇게 저장하면...UserDefaults.standard.set("super_secret_token_12345", forKey: "auth_token")실제로는 이런 곳에 ..
Combine(2)- Operator
·
iOS/반응형프로그래밍
Operatorpublisher가 방출하는 데이터 스트림을 가공하거나 제어하는 강력한 도구1. Map: publisher의 모든 요소를 변환하여 새로운 스트림으로 방출Map과 ForEach차이- 반복을 하는 것은 똑같지만 ForEach는 여기서 부터 여기까지 반복을하겟다 명시라면 map은 바꾸겟다라는 명시. 물론 ForEach에서 변환할수 있다= 이것자체가 Map . 다른사람이 봤을때 Map이 있으면 아~ 바꾸려나 보다~~ 이해할수 있다. 2. tryMap : Map과 같지만 클로저 오류발생시키면 Publish 종료3. compactMap: nil을 제외하고 nil이 아닌것만 publish4. replaceNil : nil들을 내가 원하는 element로 변환5. scan: 아래와 같이 더한다. 누적 ..
Queue 10845 - swift
·
알고리즘
큐 구현이다. swift로는 큐를 어떻게 구현하는지를 물어보는 거였다. // // main.swift // Queue // // Created by 235 on 2023/09/05. // import Foundation struct Queue{ var queue: [Int] = [] public var size: Int { return queue.count } public var isEmpty: Bool { return queue.isEmpty } public var front: Int { return isEmpty ? -1 : queue[0] } public var back: Int { guard let last = queue.last else {return -1} return last } mutati..
1259 - swift로풀기
·
알고리즘
오랜만에 돌아왔습니다 ㅠㅠㅠ 한동안 알고리즘을 놓다가 다시 잡게 되었네요. 이전까지는 주로 난이도 있는 것들을 파이썬으로 푸는 풀이들을 올렸었는데 리뉴얼을 했습니다!!! 올해 마치고 바로 취업에 목표를 둔것이 아니기에 swift로 차근차근 난이도를 높여가며 풀어과는 과정을 이제부터 올릴 예정입니다. 대망의 첫문제는 바로 유명한 팰린드롬수! 문제의 이해는 브론즈1로 낮기에 바로 풀이로 들어가겠습니다. // // main.swift // Algoritm // // Created by 235 on 2023/09/04. // import Foundation var arr: [String] = [] while true { var input = readLine()! if input == "0"{ break }els..
TaskGroup
·
iOS
TaskGroup뭐 간단한 병렬실행이면 async let을 써주면 된다. 하지만 이게 수없이 많다면? async let 계속쓸래??또한 static하게 결정된 task에서만 쓸수 있다. 왜? 우리가 async let 으로 다 일일이 해줘야하기에!!만약 모든 이미지를 가져와야하는경우 필요한 개수를 미리 알수 있을까?⇒ nono 그건 컴파일시점에 알수 있는것이 아닌 런타임 시점에 알수 있다.런타임때마다 달라질수 있는 child Task들을 동적으로 만들어줄수 있다!! 😆 😆 😆Taskgroup을 만들기 위해서는 withTaskGroup(of:returning:body:)를 호출!throwing taskgroup → withThrowingTaskGroup(of:returning:body:) 에러던질때! ..
Swift Concurrency - Async/Await⭐️
·
iOS
GCD의 한계점들.Thread Explosion가장 큰 문제는 Thread Explosion입니다. GCD는 새로운 작업이 들어올 때마다 "혹시 기존 스레드가 block되어 있나?"를 확인하고, block되어 있으면 새 스레드를 생성해버려요. 그런데 제가 이거 실제 DispatchQueue 여러개 찍어내고 해보니까 62개까지 쓰레드가 생성되더라고요. 결국 GCD의 쓰레드풀은 64개인것 같습니다.64개를 넘어가면:새로운 작업들은 기존 스레드가 해제될 때까지 대기하고 스레드 재사용하며 무한정 스레드를 만드는것은 아닙니다.Thread Explosion의 진짜 문제는 개수보다는: 각 쓰레드 마다 가지고 있는 메모리의 오버헤드, context Switching 비용인것 같습니다.Priority Inversion의..