일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- swift
- MKMapItem
- 서체관리자
- MKMapViewDelegate
- 영문 개인정보처리방침
- SwiftUI Boolean 값
- WeatherManager
- UICollectionViewFlowLayout
- CoreLocation
- Timer
- RunningTimer
- 한국어 개인정보처리방침
- Protocol
- addannotation
- AnyObject
- Xcode
- weatherKit
- 클로저의 캡슐화
- dispatchsource
- weak var
- xcode로 날씨앱 만들기
- 러닝기록앱
- font book
- 러닝타이머
- 단일 책임원칙
- App Store Connect
- Required Reason API
- Startign Assignments
- UIAlertAction
- CLLocationManagerDelegate
- Today
- Total
목록Whale life (215)
VesselWheel
Left Constraint는 어떤 객체의 왼쪽을 뜻하고, Leading Constraint는 어떤 객체의 앞쪽 가장자리를 뜻한다. Left Constrint와 Right Constraint는 절대적이며 항상 화면 또는 컨트롤의 왼쪽 / 오른쪽을 참조한다. Leading Constraint와 Trailing Constraint는 device locale의 영향을 받는다. (장치별 국가 설정) - 읽기 방향이 오른쪽에서 왼쪽인 locale(예: 히브리어, 아랍어)에서는 leading이 오른쪽이 되고 trailing이 왼쪽이 된다. left constraint와 leading constraint는 Auto Layout에서 UI 요소의 위치를 정의할 때 사용하는 개념입니다. 두 가지 방식은 유사해 보일 수 있..
UISheetPresentationController을 이용해서 하프모달을 구현해보자. 공식문서 https://developer.apple.com/documentation/uikit/uisheetpresentationcontroller UISheetPresentationController | Apple Developer Documentation A presentation controller that manages the appearance and behavior of a sheet. developer.apple.com 맵뷰에서 킥보드 등록을 위해 [대여하기]버튼을 탭하면 킥보드의 대여상태를 UI로 구현하기 위해 여러가지 방법이 있다. 그 중에서 [대여하기] 버튼을 탭하면 Register로 뷰를 전환할 때..
Sets the property of the receiver specified by a given key to a given value. 인스턴스 매소드로 부여된 key와 key를 쌍으로 저장한다. key값은 String으로 받는다. setValue(_:forKey:) func setValue( _ value: Any?, forKey key: String ) 공식문서 https://developer.apple.com/documentation/objectivec/nsobject/1415969-setvalue Todo 앱을 만들면서, Userdefaults를 이용한 데이터를 저장할 때 사용되는 setValue 매소드 // // TodoStore.swift // TodoList // // Created by ..
풀이 import Foundation let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! } let (a, b) = (n[0], n[1]) for _ in 0..
들어가기 앞서, xcode를 활용하여 UIKit에서 코드베이스로 협업을 진행하게 되면 명확하게 명문으로 보이는 코드를 통해 MVC (Model - View - Controller) 패턴가 연결이 되기 때문에 충돌이 발생하기 전에 코드에서 에러코드를 확인할 수 있다는 장점이 있다. 하지만, storyboard를 활용하게 되면 내가 만들고 있는 UI 객체들의 생김새와 기능을 GUI로 직접 보면서 작업할 수 있다는 것이 장점이다. MVC 패턴이란? 더보기 MVC 패턴이란? Model 애플리케이션의 데이터와 비즈니스 로직(화면과 전혀 관련이 없는 로직과 데이터 관련) ex) DB, 서버에서 가져온 컨텐츠, DTO와 같은 사용자 정의 클래스 또는 구조체 View View는 사용자 인터페이스를 표현하고 사용자에게 ..
Mac 키보드 단축키 특정 키 조합을 눌러 보통은 마우스, 트랙패드 또는 기타 입력 기기가 있어야 가능한 작업을 수행할 수 있습니다. 키보드 단축키 사용하기 키보드 단축키를 사용하려면 하나 이상의 조합 키를 누른 상태에서 단축키의 마지막 키를 누릅니다. 예를 들어 command-C(복사)를 사용하려면 command 키를 누른 상태에서 C 키를 누른 다음 두 키를 놓습니다. Mac 메뉴와 키보드에서는 다음과 같은 보조 키를 비롯한 특정 키가 기호로 표시되기도 합니다. command(또는 cmd) ⌘ shift ⇧ option(또는 alt) ⌥ control(또는 ctrl) ⌃ caps lock ⇪ Fn Windows PC용 키보드에서는 option 키 대신 Alt 키, command 키 대신 Ctrl 키 ..
공식문서 https://developer.apple.com/documentation/foundation/userdefaults UserDefaults란? UserDefaults는 간단한 Key-Value 데이터를 저장하는데 사용됩니다. 주로 설정 값이나 사용자 기본 설정과 같은 작은 데이터를 저장할 때 사용됩니다. 여기서 key값은 꼭 String 타입이여야 합니다. // 데이터 추가 및 업데이트 UserDefaults.standard.set(value, forKey: key) // 데이터 조회 | Any? 타입이여서 as를 사용한 타입 변환 후 사용 UserDefaults.standard.value(forKey: key) // 데이터 조회 | 특정 타입으로 반환할 경우 (String) UserDefau..
Decodabe, Encodable, Codable 이해하기 Decodable 프로토콜 Decodable 프로토콜은 데이터를 객체로 디코딩할 때 사용됩니다. 즉, 외부 데이터(JSON)를 Swift의 데이터 모델로 변환하는데에 필요한 프로토콜입니다. **Decodable**을 준수하는 객체는 외부 데이터를 해석하고 그 데이터를 객체의 프로퍼티로 매핑할 수 있어야 합니다. 이곳에서 CodingKeys 는 디코딩 할 때, 프로퍼티들에 대한 매핑을 제공하는 역할을 합니다. 아래 예시에서는, id라는 프로퍼티의 디코딩 키를 key로, name 프로퍼티의 디코딩 키를 프로퍼티 이름과 동일하게 지정한 예시입니다. struct User: Decodable { let id: Int let name: String // ..
아직은 생소하지만 개발자로서 앱을 개발하려면 데이터를 스왑하기 위해? 네트워크 통신을 통해 다양한 API에서 데이터를 가져와야한다. 따라서 swift에서 다루는 URL, REST API, Decodable/Encodable/Codable에 대한 개념을 이해하고 데이터 모델링을 숙달하고자 한다. URLSession을 통해 REST API와 통신할 수 있다. URL 구성요소란? 더보기 각 구성요소들은 API 엔드포인트와 함께 특정 자원에 대한 요청을 식별하고 전달하는 데 사용됩니다. ### **프로토콜 (Protocol)** URL은 일반적으로 **`http://`** 또는 **`https://`**와 같은 프로토콜로 시작합니다. 이는 클라이언트와 서버 간의 통신 방법을 지정합니다. **`http://`**..
UIKit Code로 쓰는 UI 장점 유지보수 용이성: 코드로 UI를 작성하면 코드의 버전 관리 및 수정이 용이하며, 코드베이스를 유지 비용이 적습니다. Git과 같은 버전 관리 도구를 활용하여 협업 시 코드 변경을 효과적으로 관리할 수 있습니다. 동적인 UI 작성: 코드로 UI를 구성하면 런타임에 동적으로 UI를 변경하거나 조작하기 용이하며, 복잡한 UI 로직을 더 쉽게 구현할 수 있습니다. (버튼에 따른 UI 이동 등을 구현하기 용이합니다.) 분업 용이성: 개발자가 각자의 역할(디자인 구현, 비즈니스 로직 구현 등)에 집중할 수 있으며, 작업 분담이 용이합니다. 단점 시각화 어려움: UI의 구성 요소를 코드로 작성하면 디자인을 미리 시각적으로 확인하기 어렵습니다. 디자이너가 실시간으로 디자인을 확인하..
들어가기 앞서, 타이머 기능을 위해서는 클로저의 탈출 클로저(Esacaping closure)의 비동기 실행에 대한 이해가 필요하다. 탈출 클로저(Esacaping closure) 란? 더보기 코드의 순차적 실행과 비동기의 실행 순서 // 순차적 실행 func sequentialExecutionExample() { print("Start") // 1. 첫 번째 작업 for i in 1...3 { print("Task \(i)") } // 2. 두 번째 작업 print("Next Task") // 3. 세 번째 작업 let result = 5 + 3 print("Result: \(result)") print("End") } sequentialExecutionExample() /* 위의 코드는 함수 sequ..
사용 목적 아이폰에서 일반적으로 프로퍼티를 선택했을 때 선택을 안내하거나 경고창을 알릴 때 사용하는 매서드 present(_:animated:completion:) 이 클래스를 사용하여 표시하려는 메시지와 선택할 작업이 포함된 경고 및 작업 시트를 구성합니다. 원하는 작업과 스타일로 경고 컨트롤러를 구성한 후 메서드를 사용하여 표시합니다 . UIKit은 앱 콘텐츠에 대해 모달 방식으로 경고와 작업 시트를 표시합니다. addAction(_:) 사용자에게 메시지를 표시하는 것 외에도 작업을 경고 컨트롤러와 연결하여 사람들에게 응답 방법을 제공할 수 있습니다. 메서드를 사용하여 추가하는 각 작업에 대해 경고 컨트롤러는 작업 세부 정보가 포함된 버튼을 구성합니다. 사람이 해당 작업을 탭하면 경고 컨트롤러는 작업..
정수 값에 세자리수 마다 콤마를 넣는 방법으로 .numberStyle을 .decimal로 저장한다. let numberFormatter = NumberFormatter() numberFormatter.numberStyle = .decimal let result = numberFormatter.string(from: NSNumber(value: 1000000)) print(result! + "원") Double 타입에 대한 확장(extension)으로, "formattedString()"이라는 메소드 extension Double { func formattedString() -> String { let numberFormatter = NumberFormatter() numberFormatter.number..
통일성을 갖는 셀의 관리를 위해 UICollectionView를 사용한다. 그중에서, Flowlayout은 컬레션뷰에 종속된 셀의 간격, 여백 등을 조정할 수 있는 프로토콜이다. UI Peroperties를 선언 // MARK: - UI Properties private lazy var collectionView: UICollectionView = { let layout = UICollectionViewFlowLayout() let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) collectionView.translatesAutoresizingMaskIntoConstraints = false collectionV..
MenuView와 OrderListView 간의 데이터 연결을 위해서 MenuDataDelegate를 약한 참조로 연결하였다. weak var delegate: MenuDataDelegate?는 약한 참조를 사용하여 MenuDataDelegate 프로토콜에서 구현한 객체를 참조하는 변수를 선언하는 코드로 이를 통해 객체 간의 통신을 위임하고, 메모리의 누수를 일으키지 않고 안전하게 처리할 수 있게 된다. 약한참조란?(ps. 미소유참조) 더보기 Weak Reference (약한 참조) 약한 참조는 Strong Reference(강한 참조)와는 달리 객체의 참조 count 증가시키지 않습니다. 객체의 생명 주기에 영향을 주지 않으면서 참조를 유지할 수 있습니다. class Person { var name: ..
들어가기 앞서, 평소 사용하던 키오스크 앱이나, 카페, 페스트 푸드 어플리케이션을 보면 내가 원하는 메뉴를 선택하기 위해 메뉴 그림, 가격을 나열해 둔 것을 볼 수 있다. 스타벅스 같은 경우, 위에서 아래로 메뉴가 나열되어 있어, 데이블뷰로 구현되어 있다. 하지만, 블로그에서 다루지는 않겠지만 다른 메뉴를 선택하고 주문하는 앱들을 보면 MD 상품이나 회원가입이 우선되어 원하는 메뉴를 찾기 위해서 여러번 클릭해야하는 경험을 해왔다. 이점에서 불편함을 경험하였고, 부분적이지만 collectionView로 해당 상품들을 직관적으로 볼 수 있도록 구현해 보았다. MenuView 클래스에 구현된 CollectionView 더보기 // // MenuView.swift // SPABUCKS-Kiosk-iOS // /..
문제 풀이 import Foundation let n = readLine()!.components(separatedBy: [" "]).map { Int($0)! } let (a, b) = (n[0], n[1]) for _ in 0..
Starting Assignments 의 구성 프로젝트 제목/간단 설명 프로젝트 명칭, 그리고 서비스의 핵심적인 목적 또는 기능에 대해 설명해주세요. 프로젝트 명은 언제든 변경해도 괜찮으니 부담 갖지 말고 가볍게 지어보세요! 와이어프레임 Figma 같은 디자인 툴을 익히느라 시간 낭비하지마세요! 그림판도 괜찮습니다. 이렇게, 손으로 그려보아도 좋아요. 최대한 구체적으로 그리는 것이 핵심입니다. 개발 기능 정리 스파벅스 SPABUCKS ✔️ 카페 메뉴를 주문할 수 있는 키오스크 카테고리 및 메뉴를 선택할 수 있다 주문내역 변경 및 삭제를 할 수 있다 주문을 취소 및 결제할 수 있다 와이어프레임 https://xd.adobe.com/view/4596c295-398e-45c3-9108-24a6c88726ff-..
접두사로 NS가 붙은 타입은 NSString, NSArray, NSSet, NSDictionary 등등 여러가지가 있다. 이들은 NextStep의 줄임말로, 예전 Objective-C 시절의 타입을 일컫는다. 클래스로 구현되어 있다. Foundation 프레임워크를 import 하여 사용해야 한다. 스위프트에서는 필요 시 Swift의 타입들을 이들 타입으로 브릿징 하여 사용할 수 있다.(예를 들어 String을 NSString 으로) NS 타입에 관한 좋은 글: https://yagom.net/forums/topic/%EA%B8%B0%EC%B4%88%EC%A0%81%EC%9D%B8-swift-%EB%AC%B8%EB%B2%95-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%8..
문제 풀이 func solution(_ arr1:[[Int]], _ arr2:[[Int]]) -> [[Int]] { var result: [[Int]] = [] for i in 0..
Mac에서 앱을 Split View로 사용하기 - xcode로 코딩하다보면 시뮬레이터와 코드화면을 가까이 보고자할 때 사용하면 편하다. Mac의 많은 앱은 두 앱이 나란히 동시에 작업할 수 있는 Split View 모드를 지원합니다. Mac에서 윈도우 왼쪽 상단 모서리에 있는 녹색 버튼으로 포인터를 이동한 다음, 나타나는 메뉴에서 화면 왼쪽 타일 윈도우 또는 화면 오른쪽 타일 윈도우를 선택하십시오. 화면의 다른 쪽에서 작업할 두 번째 앱을 클릭합니다. 새로운 데스크탑 Spaces에 Split View가 생성됩니다. Split View에서 다음을 수행합니다. 메뉴 막대 보기 또는 가리기: 화면 상단으로 포인터를 이동하거나 다른 위치에 놓습니다. 전체 화면에서 메뉴 막대를 가리고 표시하는 옵션을 선택 해제한..
// // ViewController.swift // UICollectionView // // Created by Jason Yang on 12/14/23. // import UIKit class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout { let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout()) let data = ["Item 1", "Item 2", "Item 3"] override func vie..
// // ViewController.swift // Logic_test // // Created by Jason Yang on 12/13/23. // import UIKit class GreenViewController: UIViewController { @IBOutlet weak var textLabel: UILabel! //weak 참조로 액션함수에 따른 변경 가능 private var count: Int = 0 // 내부 프로퍼티로 count 숫자 0으로 시작 override func viewDidLoad() { super.viewDidLoad() // 실행 한 후 화면 지정 // Do any additional setup after loading the view. self.refreshTextL..
브레이크 포인트란 파란색 화살표를 통해 버그가 의심되는 코드에서 코드 실행을 멈출 수 있는 도구 LLDB 개념 이해하기 손쉽게 버그를 추적하고 매번 빌드를 하여 테스트를 해보는 런타임 시간을 줄이기 위해 사용하는 디버거 Low-Level Debugger라는 뜻으로 LLVM의 디버거 컴포넌트를 개발하는 애플의 서브 프로젝트 로우레벨 컨트롤 가능한 모듈로 이뤄져있으며 기계어에 가까운 영역까지 디버깅 가능 (C/C++/Objective-C/Swift 지원) Xcode의 기본 디버거로 내장 Clang식 파서 및 LLVM 디스어셈블러와 같은 LLVM 프로젝트의 기본 라이브러리를 활용한 재사용 가능한 컴포넌트 집합으로 빌드됨 실제 프로그램이 어떻게 동작하는지 이해가 쉬워짐 LLVM의 프론트엔드에 대응하는 디버거로 ..
// // ViewController.swift // UIPickerView // // Created by Jason Yang on 12/12/23. // import UIKit class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { let pickerView = UIPickerView() // 인스턴스화 let data = ["Option 1", "Option 2", "Option 3"] //데이터 설정 override func viewDidLoad() { super.viewDidLoad() setUIPickerView() func setUIPickerView() { let pickerView = UIP..
Xcode 단축키 모음 더보기 https://vesselwheel.tistory.com/81 Xcode 시작하기 학습목표 Xcode를 설치하는 방법을 알 수 있습니다. Xcode를 통해 iOS 프로젝트를 생성하는 방법을 알 수 있습니다. 생성한 Xcode 프로젝트 실행하여, iOS 앱을 실행(빌드)할 수 있습니다. Xcode의 Interface에 대해 이해할 수 있습니다. Xcode 설치하기 Xcode를 설치하는 두가지 방법 중 편한 방법을 선택하여 Xcode를 설치합니다. Mac App Store에서 설치합니다. URL : Mac App Store에서 제공하는 Xcode (apple.com) 장점 : 앱스토어의 자동업데이트 기능을 통해 최신버전을 유지할 수 있음 단점 : 비교적 느린 다운로드 속도 Ap..
import Foundation protocol Eatable { var name: String { get set } var description: String { get set } var price: Double { get set } func displayInfo() } extension Eatable { func displayInfo() { print("\(name) | W \(price) | \(description)") } } 1. protocol Eatable {} Swift의 protocol은 특정 기능이나 속성을 정의하는 방법입니다. 이를 통해 클래스, 구조체, 열거형 등이 이 프로토콜을 채택(conform)하면 해당 프로토콜에 정의된 메서드, 속성 등을 구현해야 합니다. 예를 들어, 여기서..
옵셔널 💡 값이 없음을 포함하는 옵셔널의 개념 옵셔널과 nil 값이 없을 수 있는 상황에서 옵셔널(Optional)을 사용합니다. 옵셔널은 물음표 ? 로 나타냅니다. (타입 어노테이션) 옵셔널은 두 가지 가능성을 나타냅니다. 값이 있고 옵셔널로 래핑(wrapping)해놓은 값을 언래핑(unwrapping)하여 해당 값에 액세스할 수 있다. 값이 전혀 없다. 옵셔널 타입끼리의 연산은 불가능 예시 코드 // 축약 타입 표현 var serverResponseCode: Int? = 404 // 정식 타입 표현 var myPetName: Optional = "멍멍이" func pay(with card: String?) { // 구현 코드 } // 옵셔널 타입끼리의 연산은 불가능 var num1: Int? = 4 ..
메인메뉴 class class menu 에서 printMainMenu() 클로져로 초기화 하고 while true 문으로 콘솔창에 프린트 될 shakeshack menu를 입력한다. 키오스크 화면(콘솔 창)에서 shakeshack menu는 무한 반복되어 입력 결과에 상관없이 계속 프린트 되어야 한다. 하지만 while true는 무한 반복문으로 명시적인 종료 조건이 필요하다. 따라서 사용자가 0을 입력하면 "키오스크를 종료합니다." 를 프린터하면서 return으로 함수를 종료한다. 보조메뉴1 메소드 if let input = Int(readLine() ?? "") 이 부분의 코드는 Optional Binding과 Optional Chaining을 이용한 코드로 1. readline() ?? "" : 사..