일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- requirenativecomponent
- 360도 뷰어
- 뷰 정체성
- 뷰 생명주기
- 3b52.1
- 앱 성능 개선
- ios
- launchscreen
- Android
- 스켈레톤 통합
- ssot
- 파노라마 뷰
- 명시적 정체성
- SwiftUI
- 구조적 정체성
- 리액트 네이티브
- data driven construct
- react-native-fast-image
- 360도 이미지
- 네이티브
- native
- 라이브러리 없이
- panorama view
- React-Native
- privacyinfo.plist
- launch screen
- 360도 이미지 뷰어
- 리액트
- React Native
- react
- Today
- Total
목록개발지식 정리 (60)
Neoself의 기술 블로그
약수의 개수와 덧셈func addMinus(_ left:Int, _ right:Int) -> Int { var ans = 0 for i in left...right { var cnt=1 // 원래 수 if i != 1 { for a in 1...i/2 { if i%a==0 {cnt+=1} } } ans += cnt%2==0 ? i : -i } return ans}... 연산자를 활용하여 순회할 범위를 지정한 다음, 매 순회마다 %연산자로 약수인지 여부를 파악하였다. 이때 시간복잡도를 줄이고자 순회하는 범위를 i가 아닌 i/2로 축소하였는데, 이의 경우 i가 1일 경우는..
제일 작은 수 제거하기func removeLeast(_ arr:[Int]) -> [Int] { var arrMin = arr.min() return arr.count == 1 ? [-1] : arr.filter{$0 != arrMin}}filter함수로 매 요소마다 arr.min()함수를 호출하면 1번 케이스에서 시간초과를 겪는데, arr.min() 함수는 그 자체로 모든 요소를 1회 순회하며 O(n) 시간 복잡도를 갖기 때문이다. 따라서 arrMin 변수 선언 시에만 해당 함수를 실행하고, 이후 filter로 arr 순회할때 해당 변수를 재사용 할 경우 시간초과 문제를 해결할 수 있다. 핸드폰 번호 가리기func phoneNum(_ phone_number:String) -> String..
평균 구하기func getMean(_ arr: [Int]) -> Double { return Double(arr.reduce(0,+))/Double(arr.count)}reduce 고차함수를 사용해 총합을 구한후, 인자 배열 내부 요소 개수를 나누어 평균값을 구하였습니다. 이때 반환 타입 Double임을 유의하여 타입을 수동 지정해주었습니다. x만큼 간격이 있는 n개의 숫자시간복잡도: O(n) = map 고차함수로 모든 요소 순회하기 때문func x_n_other(_ x:Int, _ n:Int) -> [Int64] { return Array(1...n).map { Int64($0 * x) }} 1...n로 1~n까지의 범위를 생성한 후, Array 함수에 삽입하여, 1부터 n까지 순차적으로 요..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bmAF6t/btsJ0QEOzdH/4vrFSOe0uyhxj8d0Du0LlK/img.png)
0. 프로젝트에 WatchOS 타겟 추가우선 심박수를 측정하는 애플워치에서 동작할 WatchOS 앱과 심박수 데이터를 전달받고 처리하는 iOS 앱이 있어야 합니다.만일 iOS 앱만 생성되어있다면, 같은 프로젝트에서 WatchOS에 대한 새 타겟을 추가해줘야 합니다. 1. Xcode 상단 메뉴 File > New > Target을 클릭2. WatchOS 탭에 있는 App 선택3. Product Name을 설정 & "Watch App for Existing iOS App"을 선택 후 기존 iOS Target 선택WatchOS Target이 동일 프로젝트 내부에 생성되었다면, 생성된 WatchOS 타겟에 대해 Bundle Identifier를 확인합니다.watchOS 타겟 생성 시, 사진처럼 {iOS의 번들..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bT7jaU/btsJYFkGbSg/MMh4A2zKgB5wpxXpeldbXk/img.png)
이 게시글은 프론트엔드로 Swift, SwiftUI, 백엔드로 Node.js & Mongoose(MongoDB)를 사용해 소셜로그인을 구현하는 방법을 작성한 글입니다. 소셜로그인을 구현하고자 하는 풀스택 개발자에게 도움이 되었으면 합니다! 0. 사전설정구글 소셜로그인을 위해 GoogleSignIn 프레임워크를 PodFile에 명시한 후 'pod install'을 실행해 워크스페이스에 추가해줍니다.이때, 애플 로그인에 필요한 AuthenticationServices 프레임워크는 외부 라이브러리가 아니기 때문에 따로 추가하지 않으셔도 됩니다.target 'exampleApp' do # Comment the next line if you don't want to use dynamic frameworks ..
저처럼 React Native 개발을 해오다가, Swift와 SwiftUI 앱개발 하고자 기술스택을 변경한 사람들의 시간을 절약시키고자, 제가 여태껏 Swift로 모바일 앱을 제작하면서 느꼈던 React Native와의 유사점과 차이점들을 중점으로 설명을 드리고자 합니다. 1. 상태관리우선 Swift로 넘어오면서, 가장 적응하기 어려웠던 것은 상태관리 방식이였습니다.import React, { useState } from 'react';function HomeScreen() { const [selectedTags, setSelectedTags] = useState([]); const [sortOption, setSortOption] = useState('default'); const [..
최댓값과 최솟값func solution(_ s: String) -> String { let myArr = s.components(separatedBy: " ").compactMap{ Int($0) } return "\(myArr.min() ?? 0) \(myArr.max() ?? 0)"}.components(separatedBy: " ")Swift의 String 클래스에서 제공하는 메서드입니다.함수를 통해 "1 2 3 4"와 같이 공백과 함께 주어진 String값들을 데이터 접근이 용이한 [String] 타입의 배열로 반환합니다. .compactMap {}Swift의 고차 함수 중 하나로, map과 filter 기능을 결합한 것과 유사하다고 생각하면 된다.이때, 변환한 결과가 nil이면 자동으..
iOS 앱개발에서 사용자의 정보를 안전하게 관리하기 위해 Apple이 제공하는 매커니즘은 2가지가 있습니다.바로 UserDefaults와 Keychain입니다. 먼저 이 두 매커니즘의 차이를 비교해보도록 하겠습니다.UserDefaultsKeychain키-값 쌍으로 데이터 저장데이터베이스가 암호화됨앱이 삭제되면 데이터도 삭제됨앱이 삭제되어도 데이터 유지보안수준 상대적으로 약함보안수준 높음간단한 사용자 설정 및 비민감 정보 저장에 적합비밀번호, 인증토큰 저장에 적합사용용도: 언어, 최근 검색어, 앱 실행 횟수 ...사용용도: 인증 토큰, 암호화 키 ... 제가 제작한 앱인 TyTE에서는 아래와 같이 KeychainManager 클래스를 따로 만들어 Keychain 관련 작업을 정리 및 추상화하였습니다.먼..
기존에 출시한 TyTE 어플리케이션의 성능 최적화를 위해 인스턴스의 생성 및 해제 시점을 파악하고자 각 ViewModel 및 서비스 레이어에 print문을 배치시키고 홈화면에 진입한 결과, 아래 로그 내용을 볼 수 있었습니다.MainTabView initializedTodoService initializedSharedTodoViewModel initializedTodoService initializedHomeViewModel initializedTodoService initializedHomeView initialized... 로그인 및 회원가입을 완료하게 될 경우, 가장 먼저 진입하는 뷰인 MainTabView, 하위 뷰들에게 주입하고자 MainTabView에서 초기화를 거친 SharedTodoVie..
ARC(Automatic Reference Counting)은 Swift에서 메모리 관리를 자동화하는 시스템입니다. 이름에서 짐작할 수 있듯, ARC는 각 객체가 참조되는 횟수를 추적함으로써, 객체가 필요하지 않을때 자동으로 메모리에서 객체를 해제하는 시스템인데, 이때 참조 횟수의 기준은 강한 참조를 의미합니다. 아래 코드에서는 몇번의 강한 참조가 발생하고 있을까요?? class HomeViewModel: ObservableObject { private let todoService: TodoService init( todoService: TodoService = TodoService() ) { self.todoService = todoService } ..