본문 바로가기

전체 글

(33)
Swift에서 DI/DIP 이해하기 💉 DI ? DI(Dependency Injection)는 의존성 주입의 약자로 상위 모듈에서 하위 모듈을 불러와서 제어하기 위해 사용하는 프로그래밍 기법이다. 하위 모듈의 프로퍼티나 메소드를 상위 모듈에서 사용하기 위해 필요하다. 간단한 SwiftUI 예제를 통해서 알아보자! // DI: Dependency Injection (의존성 주입) struct DIView: View { @StateObject var viewModel: DIViewModel // 👈 DI! var body: some View { Text(viewModel.data) } } class DIViewModel: ObservableObject { @Published var data = "wait some data..." let rep..
SwiftUI로 Countdown Timer 만들어보기 💫 Timer를 활용한 방법 struct ContentView: View { var body: some View { VStack { Text("Timer") TimerCountdownTimer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding() } } struct TimerCountdownTimer: View { @State private var timeRemaining = 10 private let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var body: some View { ZStack { if timeRemaining > 0 { Text("\(time..
Jupyter Notebook 서버에서 실행하기! Jupyter Notebook을 로컬이 아닌 서버에 올려서 어디서나 접속 가능하여 사용하게 해보자 서버 준비 먼저 서버가 필요한데 여러군데를 본 결과 저렴하게 많이 사용하고 있는 것 같은 Vultr 여기서 인스턴스를 생성해서 사용했다. 서버 세팅 # xxx.xxx.xxx.xxx -> 접속할 IP Address ssh root@xxx.xxx.xxx.xxx # 그리고 비밀번호를 입력해서 접속하자 생성한 인스턴스로 접속을 하고 # 파이썬 버전정보 확인 python3 --version # pip3 버전정보 확인 (파이썬과 버전을 맞추는게 좋다) pip3 --version # Jupyter Notebook 인스톨 pip3 install jupyter 위를 차례대로 실행해서 주피터 노트북을 설치하면 된다. 추가로 ..
Swift CommonCrypto로 AES 암/복호화 하기! (without CryptoSwift) 💫 서론 이번에 파일을 암호화/복호화를 해야 할 일이 있었는데 구글링 했을 땐 대부분 CryptoSwift 라이브러리를 사용하고 있었다. 하지만 내가 해야 되는 것은 복호화만 간단히 하면 되어서 라이브러리를 사용하기에는 오버스펙인 것 같아 내장 모듈인 CommonCrypto를 사용하여 직접 구현하면서 정리하게 되었다. 💫 요구사항 이 사이트는 온라인에서 AES를 암호화/복호화 하는 사이트인데 이 것을 목표로 요구사항을 작성하였다. - AES 암호화 - 128bit, 192bit, 256bit 키 알고리즘 - CBC, ECB 모드 지원 - IV 지원 - Base64, Hex 출력 포맷 지원 - 파일지원 x - Padding은 pkcs7만 지원 💫 목표!! (결과값) Hello, Crypto! 라는 문구를..
UserDefaults에서 .value(forKey:)와 .object(forKey:)는 뭐가 다른 건가요? https://stackoverflow.com/questions/42472327/what-is-the-difference-between-objectforkey-and-valueforkey-in-userdefault What is the difference between object(forKey:) and value(forKey:) in UserDefaults? I've set some user defaults using let userDefaults = UserDefaults.standard, and when I'm retrieving them, I can use any of these: jobTextField.text = userDefaults.object(forKey: "job") as? String..
논리 게이트를 Swift로 구현해 보자! AND게이트 (논리곱) 두 개의 입력이 모두 참일때 참을 반환, 하나라도 거짓일 때 거짓을 반환 let sample1 = [true, true, true, true] let sample2 = [true, true, true, false] let sample3 = [true, false, false, false] let sample4 = [false, false, false, false] func checkAllTrue(in array: [Bool]) -> Bool { array.reduce(true) { $0 && $1 } } checkAllTrue(in: sample1) // true checkAllTrue(in: sample2) // false checkAllTrue(in: sample3) // fa..
WidgetKit 시작하기 💫 WidgetKit 실행하기 먼저WidgetTutorial 프로젝트를 생성주었다. (사진 없음..ㅎ) 그리고 File > New > Target...을 눌러 Widget Extentsion을 찾아 추가해준다. MyWidget이라는 이름으로 위젯을 추가하고 Include Configuration Intent는 체크해제하고 Finish를 눌러 위젯을 추가한다. 만약 스키마를 추가할지 팝업이뜨면 Activate를 눌러서 추가해준다. 그러면 이제 MyWidget폴더와 파일이 생성된것을 확인할 수 있다..! 타겟이 MyWidgetExtention으로 되어있다면 WidgetTutorial앱으로 변경하고 실행해보자 앱을 빌드하고 바탕화면으로 나간뒤 위젯이 잘 나오는지 확인해보면 정상적으로 되는 것을 볼 수 있다~!..
SwiftUI 그라데이션 텍스트 구현하기 💫 공통으로 사용할 변수 private let sampleText = "🍎 iOS 연구소\n It's Gradient Text View :)" private let commonGradient = LinearGradient(colors: [.red, .blue, .green, .yellow], startPoint: .leading, endPoint: .trailing) 공통으로 사용할 텍스트와 Gradient뷰를 변수로 할당해 놓았다. 🌈 방법 1) Gradient에 Text를 mask해서 보여주기 private var gradientTextView1: some View { commonGradient .mask( Text(sampleText) .font(.title) .multilineTextAlignme..