최근 운동 서비스 앱을 SwiftUI 로 작업하다가 뷰에 그림자를 만들었습니다.이런 UI를 그리고 싶었거든요... 그런데 이런 보라색 오류가 보였습니다.오류를 눌러봐도 어디에 오류가 있는건지 제대로 보여주진 않았습니다.직역해보니음.. 렌더링 비용이 많이 드는 동적 그림자를 사용하고 있다네요. shadowPath를 설정하거나 그림자를 이미지로 만들어서 사용하라고 권해주는데,저는 그림자를 하나하나 이미지로 만드는 비효율적인 행동을 하고싶지는 않으니shadowPath 를 더 알아보기로 결정했습니다. 이번 글에서는 SwiftUI에서 그림자를 최적화하여 적용하는 방법에 대해 알아보겠습니다.특히 shadow와 overlay를 사용하는 방법을 비교하고, 최적화된 그림자 적용 방법에 대해 설명하겠습니다.기존 코드: ..
학원 과제로 plist 파일로 저장한 BTS 멤버의 목록을 TableView 에 불러오고 멤버를 추가하는 기능을 완성하고있다. storyboard 기반 개발을 많이 안해봐서 이왕 연습하는거 잔뜩해보자! 하는 마음으로 하고있는데 문득 performSegue 메서드의 sender 가 Any? 타입인데 왜 nil 을 보내면 안되는지 궁금해졌다. 만능 GPT4.0 선생님께 즉시 질문 🤖 performSegue(withIdentifier:sender:) 메서드에서 sender 파라미터는 세그웨이를 트리거하는 객체를 참조합니다. 이 파라미터는 세그웨이가 시작된 위치를 식별하는 데 사용되며, 주로 어떤 UI 요소(예: 버튼, 셀 등)가 세그웨이를 트리거했는지를 알려주는 데 사용됩니다. 이 정보는 prepare(for..
UITableViewCell 을 만들때 이미 만들어진 셀이 없는 경우 아래의 코드를 이용해서 cell을 만들 수 있다. UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 이때 style: _______ 부분을 보면 총 4가지의 옵션이 있는데 아래와 같다. 하나씩 어떤 모양인지 살펴보자 .default 더보기 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: "cell") if cell == n..
원문: https://www.hackingwithswift.com/swift/5.9/convenience-asyncthrowingstream-makestream Swift 5.9의 새로운 기능: AsyncStream과 AsyncThrowingStream의 makeStream 메소드 Swift 5.9에서는 SE-0388이라는 제안을 도입하여, AsyncStream과 AsyncThrowingStream에 makeStream() 메소드를 추가했다. 이 메소드는 스트림과 그 연속성을 동시에 반환하는 기능을 가지고 있다. 여기서 단어의 의미를 한번 짚고 넘어가자면, '스트림'이란 데이터를 순차적으로 처리하는 흐름 같은 걸 의미한다. 그리고 이 데이터들이 어떻게 생성되고 끝나는지를 관리하는 걸 '연속성'이라고 부른..
원문: https://www.hackingwithswift.com/swift/5.9/consume-operator Swift에서 Consume 연산자를 이해하고 사용하기 Swift의 새로운 기능인 consume 연산자는 값의 Lifetime을 명시적으로 끝내는데 사용되며, 이를 통해 개발자가 데이터가 전달될 때 발생하는 불필요한 retain/release 호출을 줄일 수 있다. 기본 사용법 struct User { var name: String } func createUser() { let newUser = User(name: "Anonymous") let userCopy = consume newUser // [✨] print(userCopy.name) } createUser() `// [✨]` 이 주석..
새 맥북에 Xcode 설치했더니 Git 설정이 안되어있다. 다운로드 받을게 많다 ..! 두근두근 차근차근 글로 남겨놔야징 1. Git 홈페이지 방문 https://git-scm.com/download/mac Git - Downloading Package Download for macOS There are several options for installing Git on macOS. Note that any non-source distributions are provided by third parties, and may not be up to date with the latest source release. Choose one of the following options for installing Git..
원문 : https://www.hackingwithswift.com/swift/5.9/noncopyable-structs-and-enums SE-0390에서는 복사할 수 없는 구조체와 열거형 개념을 도입하여 구조체나 열거형의 단일 인스턴스를 여러 곳에서 공유할 수 있게 되었으며, 궁극적으로 소유자는 여전히 한 명이지만 이제 코드의 여러 부분에서 액세스할 수 있게 되었다. 중요: 이 변경 사항에는 여러 가지 미묘한 점이 있으므로 아래에서 명확히 설명하려고 노력했지만, 몇 가지 사항을 몇 번 읽어야 한다고 해도 놀라지 말자. 첫째, 이 변경 사항에는 요구 사항을 억제하는 새로운 구문인 ~Copyable이 도입되었다. 이는 "이 유형은 복사할 수 없습니다"라는 의미이며, 이 억제 구문은 현재 다른 곳에서는 사..
원문 : https://www.hackingwithswift.com/swift/5.9/macros SE-0382, SE-0389, SE-0397이 결합되어 컴파일 시 구문을 변환하는 코드를 생성할 수 있는 '매크로' 기능 C++에서 매크로는 코드를 전처리하는 방법으로, 메인 컴파일러가 코드를 보기 전에 코드의 텍스트 교체를 효과적으로 수행하여 손으로 작성하고 싶지 않은 코드를 생성할 수 있다. Swift의 매크로는 이와 비슷하지만 훨씬 더 강력하며, 따라서 훨씬 더 복잡하다. 또한 매크로를 사용하면 프로젝트의 Swift 코드가 컴파일되기 전에 동적으로 조작할 수 있으므로 컴파일 시점에 추가 기능을 삽입할 수 있다. 핵심 사항: 매크로는 단순한 문자열 대체가 아닌 유형 안전성이 있으므로 매크로가 작동할 데..
원문 : https://www.hackingwithswift.com/swift/5.9/if-switch-expressions 기능 매개변수 팩으로 다양한 타입을 묶어 사용하기 struct FrontEndDev { var name: String } struct BackEndDev { var name: String } struct FullStackDev { var name: String } 위와 같은 구조체 3개가 있다고 가정해보자. let johnny = FrontEndDev(name: "Johnny Appleseed") let jess = FrontEndDev(name: "Jessica Appleseed") let kate = BackEndDev(name: "Kate Bell") let kevin = B..
원문 : https://www.hackingwithswift.com/swift/5.9/if-switch-expressions 기능 if 와 switch를 표현식으로 사용할 수 있게 되었다. // if 문 예시 let score = 800 let simpleResult = if score > 500 { "Pass" } else { "Fail" } print(simpleResult) // switch 문 예시 let complexResult = switch score { case 0...300: "Fail" case 301...500: "Pass" case 501...800: "Merit" default: "Distinction" } print(complexResult) 이를 함수에 응용하면 아래와 같이 쓸..
Swift의 `@unknown` 키워드를 많이 쓰시나요? 최근 기초를 다지면서 '이런 키워드도 있었지..!' 하고 글을 작성해봅니다. 먼저 회사에서 제가 아래와 같이 코드를 짰다고 가정해볼게요. enum Menu { case chicken case pizza } let dinner: Menu = .chicken switch dinner { case .chicken: print("치킨") case .pizza: print("피자") case _: // `case default`와 같은 표현! print("메뉴가 뭔가요?") } Menu 라는 열거형은 값이 정해져 있기 때문에 사실 현재 작성된 case 를 모두 정의해주기만 하면 switch 문에서는 컴파일 오류가 발생하지는 않습니다. 그래도 코드는 언제든 ..
집합은 같은 타입의 서로 다른 값을 중복 없이 저장할 때 사용하는 집단 자료형이다. 배열과 매우 유사하지만 다른 점은 순서가 없다는 것과 중복 값이 없다는 것! 집합에 저장할 데이터 타입은 해시 연산을 할 수 있는 타입이어야 한다. 왜냐하면 내부적으로 해시(Hash) 연산의 결과값을 이용하여 데이터를 저장하기 때문이다. 해시 연산(Hash Algorithm)? 임의의 입력 값을 고정 길이의 데이터 크기로 변환해주는 알고리즘이다. 너무 길거나 너무 짧은 값이라도 고정 길이의 데이터로 저장이 가능하다! 주로 복호화가 필요 없는 암호화에 많이 사용된다고 한다. 많이 알려진 해시 알고리즘에는 MD5, SHA1, SHA256 등이 있다. Swift에서 집합을 정의하는 방법 2가지 1. 초기값을 사용하여 바로 정의..
- Total
- Today
- Yesterday
- CellStyle
- ios
- 이코테
- Swift Conference
- swift5.9
- UITableViewCell
- 핵심내용
- 싱글톤
- AsyncSwift Korea Seminar
- 의존성
- it seminar
- 자바
- SWIFT
- 꼼꼼한 재은 씨의 스위프트 문법편
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |