일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- xcode로 날씨앱 만들기
- weak var
- MKMapViewDelegate
- WeatherManager
- SwiftUI Boolean 값
- 러닝타이머
- 영문 개인정보처리방침
- 러닝기록앱
- Startign Assignments
- addannotation
- font book
- weatherKit
- 한국어 개인정보처리방침
- Protocol
- App Store Connect
- swift
- RunningTimer
- Required Reason API
- MKMapItem
- CoreLocation
- AnyObject
- CLLocationManagerDelegate
- 클로저의 캡슐화
- 단일 책임원칙
- Xcode
- UIAlertAction
- dispatchsource
- 서체관리자
- UICollectionViewFlowLayout
- Timer
- Today
- Total
목록Xcode Study (162)
VesselWheel
Starting Assignments 의 구성 프로젝트 제목/간단 설명 프로젝트 명칭, 그리고 서비스의 핵심적인 목적 또는 기능에 대해 설명해주세요. 프로젝트 명은 언제든 변경해도 괜찮으니 부담 갖지 말고 가볍게 지어보세요! 와이어프레임 Figma 같은 디자인 툴을 익히느라 시간 낭비하지마세요! 그림판도 괜찮습니다. 이렇게, 손으로 그려보아도 좋아요. 최대한 구체적으로 그리는 것이 핵심입니다. 개발 기능 정리 스파벅스 SPABUCKS ✔️ 카페 메뉴를 주문할 수 있는 키오스크 카테고리 및 메뉴를 선택할 수 있다 주문내역 변경 및 삭제를 할 수 있다 주문을 취소 및 결제할 수 있다 와이어프레임 https://xd.adobe.com/view/4596c295-398e-45c3-9108-24a6c88726ff-..
// // 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)하면 해당 프로토콜에 정의된 메서드, 속성 등을 구현해야 합니다. 예를 들어, 여기서..
메인메뉴 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() ?? "" : 사..
콘솔영역 프린트 화면 class burgerHouse { var shakeShakeMenu : String var burgerSpec : String //메뉴, 스펙 입력 전 초기화 init(shakeShakeMenu: String, burgerSpec: String) { self.shakeShakeMenu = shakeShakeMenu self.burgerSpec = burgerSpec } // burgerHouse의 class 메소드 func startKioskMenu() { // 키오스크 리스트를 출력하는 함수 출력 후 kioskMenuListPrint() //콘솔창에 출력 "원하는 메뉴 번호를 선택해주세요. print("원하는 메뉴 번호를 선택해주세요.") //콘솔창에 readLine() 활용 키..
Closure란? 클로저는 이름없는 함수 즉, 코드 블록을 말합니다. 클로저는 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다 스위프트의 클로저는 주변 환경에 있는 변수나 상수를 캡처하여 저장하고, 이를 나중에 사용할 수 있도록 합니다. 이것은 클로저가 생성될 때 클로저가 참조하는 변수 또는 상수의 값에 대한 복사본을 유지하고 저장하는 메커니즘입니다 값(value) 캡처: 클로저가 변수나 상수의 값을 캡처합니다. 이때, 클로저 내부에서 캡처한 값이 변경되어도 원본 값은 변경되지 않습니다. 참조(reference) 캡처: 클로저가 변수나 상수의 참조를 캡처합니다. 따라서 클로저 내에서 해당 변수나 상수를 변경하면 원본 값도 변경됩니다. let char: Character = "A" prin..
구조체나 열거형 내에서 매서드가 내부 속성을 수정할 수 있도록 하는 키워드 mutating func /* Swift에서 mutating 키워드는 구조체(Structs)나 열거형(Enum) 내에서 메서드(Method)가 해당 구조체 또는 열거형의 속성을 수정할 수 있도록 하는 키워드입니다. 기본적으로 Swift에서는 구조체나 열거형의 인스턴스가 상수로 선언되면 해당 인스턴스의 속성을 변경할 수 없습니다. 그러나 메서드 내에서 해당 인스턴스의 속성을 변경하려면 mutating 키워드를 사용하여 해당 메서드가 해당 인스턴스의 속성을 수정할 수 있도록 허용해야 합니다. */ // 구조체 예시 struct Point { var x = 0.0, y = 0.0 mutating func moveBy(x deltaX: ..
// // ContentView.swift // Calculator with class // // Created by t2023-m0006 on 11/29/23. // import Foundation class Calculator { /*강제 해제(Force Unwrapping)되지 않는 옵셔널 초기화 옵셔널 타입을 가진 속성은 선언과 동시에 초기화되거나 나중에 값을 할당할 수 있다. */ var firstNumber : Double? var secondNumber : Double? //덧셈 func AddOperation(_ firstNumber: Double, _ secondNumber: Double) -> Double { return firstNumber + secondNumber } //뺄샘 fu..
IOS 종합반 복습 중에 stroyboard가 xml 화면으로 변경되었다. Xcode에 내장된 github commit하고 push해서 github 홈페이지에 정상적으로 공유가 되었으나, xcode로 돌아오니 저렇게 화면이 나온다. (당황당황) 내일배움캠프 이근나 튜터님께 바로 가서 물어봤더니 해답이 바로 나온다 ㅎ 당황하다보니 구글링할 생각도 안하도 바로 달려갔다 ㅎ https://stackoverflow.com/questions/30567998/how-to-open-storyboard-as-xml-source/35304926#35304926 How to open Storyboard as xml source? I need to reorder View controllers in my Storyboard...
Class UITableViewCell The visual representation of a single row in a table view. iOS 2.0+ Mac Catalyst 13.1+ tvOS 9.0+ visionOS 1.0+ Beta @MainActor class UITableViewCell : UIView Overview A UITableViewCell object is a specialized type of view that manages the content of a single table row. You use cells primarily to organize and present your app’s custom content, but UITableViewCell provides so..
고차 함수 맵(map) map은 자신을 호출할 때 매개변수로 전달된 함수를 실행하여 그 결괏값을 다시 반환해주는 함수이다. map을 사용하기 위해서는 Swift의 Collection, Sequence 프로토콜을 따르면 가능하다. 따라서 Array, Dictionary, Set, optioanl 등에서 사용이 가능 map을 사용하여도 기존의 컨테이너의 값은 변경되지 않고 새로운 컨테이너가 생성되어 map은 기존 데이터를 변형하는데 많이 사용된다. map은 다른 함수의 형태로 입력을 받는다. map 메서드와 for-in 구문의 차이점은 코드의 재사용이나 컴파일러 최적화 성능 차이이다. 또, 다중 스레드 환경일 때 대상 컨테이너의 값이 스레드에서 변경되는 시점에 다른 스레드에서도 동시에 값이 변경되려고 할 때..
맥os SQLite 설치 방법 안드로이드나 ios 개발할 때 sqlite를 많이 쓰는데요 안드로이드나 애플에서 앱 개발시 공식적으로 sqlite를 지원하고 있습니다 오늘은 MacOS에 sqlite3 를 설치하는 방법에 대해서 알아볼게요 sqlite는 sql + light 로 sql 의 기능들을 경량화하여 기능들을 뺀 것들이 있습니다 그 점을 감안하시고 설치해주세요 % brew install sqlite3 brew install sqlite3 맥에서는 리눅스의 yum, apt 를 대신해서 brew를 사용합니다 보통 맥에서는 기본으로 sqlite가 설치되어 있어 already installed 라고 이미 설치되어 있다고 알려줄거예요, 이미 설치 되어 있으신 분은 % brew upgrade sqlite 위 명..
https://velog.io/@ryan-son/VaporSwift-Vapor를-이용하여-서버-구성하기 [Vapor/Swift] Vapor를 이용하여 서버 구성하기 Swift로 작성된 웹 프레임워크인 Vapor를 이용하여 서버를 구성하고 Heroku를 통해 배포하는 과정을 다룹니다. velog.io 이번에는 Swift로 작성된 웹 프레임워크인 Vapor를 이용하여 서버를 구성하고 Heroku를 통해 배포하는 과정을 다루어 보겠습니다. 본 포스팅은 macOS를 기준으로 작성되었습니다. Vapor 설치 Vapor를 이용하기 위해서는 다음과 같은 요구사항이 만족되어야 합니다. Xcode 11.4 이상 Swift 5.2 이상 Xcode 버전 확인 Xcode가 설치되어 있지 않으시다면 App Store를 통해 설..
import UIKit // assert / guard /* assert (검증) : code 가 통과되는지 중단되는지 검사함 guard (보호) - Early Exit (이른 탈출) */ // assert var number1: Int = 10 // 10 이면 통과 아니면 중단하기 assert(number1 == 10 , "numbe1 이 10이 아닙니다") print("number1 이 10 이라서 통과함") print("number1 :",number1) // assert(number1 == 12 , "numbe1 이 12가 아닙니다") // Assertion failed: numbe1 이 12가 아닙니다 // print("number1 이 12 이라서 통과함") // print("number1 :..
import UIKit /* Generic 주로 Collection(Array)에서 저장할 type을 하나로 통일할 때 사용함 - 클래스, 구조체, 열거형, 함수 등에서 사용함 */ // Calculation1 의 객체를 생성할 때는 Int type 만 지정할 수 있음 struct Calculation1{ var param1: Int init(param: Int){ self.param1 = param } } var calc1 = Calculation1(param: 10) // var calc2 = Calculation1(param: "10") // Calculation2 의 객체를 생성할 때는 아무 type이나 다 지정할 수 있음 // (Generic)부분을 type parameter 라고도 함 stru..
import UIKit /* Extension (확장 - (추가)) 처음 작성한 클래스의 내용(멤버변수(속성), 멤버메소드(기능))을 추가함 ㄴ 클래스, 구조체, 열거형, 기본자료형 overriding: 부모클래스에서 물려받은 메소드를 재정의함 overloading: 같은 클래스 안에서 같은 이름의 메소드의 매개변수부를 다르게 해서 구분함 extension: 다른 이름의 메소드를 추가하는 것 상속(inheritance: 확장) 추가(extension) 클래스에서만 가능함 클래스, 구조체, 열거형, 기본자료형 등에서 사용 overriding 이 가능 overriding 은 안 되고 새롭게 추가만 가능 */ // 속성 추가 // isEven 과 isOdd 는 원래 Int type 에 없는데, 추가함 exte..
import UIKit // 형변환 : Type Casting let intNum: Int = 10 let floatNum: Float = 3.64 let str1: String = "1234" // Int -> Double let doubleNum: Double = Double(intNum) print("intNum :",intNum) print("doubleNum :",doubleNum) // Float -> Int: 소숫점 이하가 표현 안 되고, 반올림도 안 됨 let intNum2: Int = Int(floatNum) print("floatNum :",floatNum) print("intNum2 :",intNum2) // Int -> String let strNum: String = String(..
import UIKit /* 형변환 : (data) type casting */ let intNum: Int = 10 let floatNum: Float = 3.14 let strNum: String = "1234" // Int -> Double let doubleNum: Double = Double(intNum) // Float -> Int let intNum2: Int = Int(floatNum) // Int -> String let strNum2: String = String(intNum) // String -> Int : 정수모양의 문자만 문자열로 형변환 가능함 // Value of optional type 'Int?' must be unwrapped to a value of type 'Int' ..
import UIKit /* protocol 가상함수 : 선언부만 있고 구현부(몸통:body) 가 없는 함수 (cf.추상메소드) 본체 특징 : 다중 상속이 가능함 여러 protocol을 한 번에 상속(확장)할 수 있음 */ // property : get, set protocol Talkable{ var lang: String{get} // 읽기 var topic: String{get set} // 읽고 씀 // 가상함수: 선언부만 있고 body가 없는 함수 func talk() } protocol Runnable{ func run() } // Person은 두 개의 protocol을 다중상속하고 있음 struct Person: Talkable, Runnable{ var lang: String // pr..
import UIKit /* Optional Chainnig () Nil 체크를 보다 편리하게 함 Optional Binding : if let 강제 unwrapping : ! 연산자 사용 이른 탈출(복귀) : guard let, guard else Optional 형변환 : as? - Nil 이 아닌 경우에만 형변환함 Optinonal 기본값 : ?? "기본값" */ class Person{ var objContact: Contact? // 생성자 함수에서 초기화하기 init(){ self.objContact = Contact() } } class Contact{ // 연락처 var name: String? var phone: String? var email: String = "010-1234-5678..
import UIKit /* 구조체(struct) 열거형(enum) 클래스(class) 값type 값type 참조type 상속 X X O extension O O O */ // 구조체 struct Student{ var name: String = "더조은" var age : Int = 30 func displayName(){ print(self.name) } } // 구조체 객체 생성하기 : new 를 사용하지 않음 var std1: Student = Student(); dump(std1) // 멤버변수와 멤버함수에 접근하기 print(std1.name) print(std1.age) std1.displayName() // 구조체의 값 복사하기: 할당연산자 let std2 = std1 dump(std2) ..
import UIKit /* 열거형 : Enum(Enumeration) Swift 의 열거형은 함수도 넣을 수 있음 */ enum Weekday{ case mon case tue case wed case thu case fri, sat, sun } var day: Weekday = Weekday.mon print("day : \(day)") day = Weekday.sat print("day : \(day)") // type 추론: 열거형의 type 을 생략할 수 있음 day = .fri print("day : \(day)") // switch 조건문과 연동해서 사용하기 switch day{ case .mon, .tue, .wed, .thu: print("월화수목") case .fri, .sat: pri..
import UIKit /* 튜플: Tuple 간단하게 사용하고 버리는 용도 형식 : () 사용 - (값1, 값2, 값3, 값4, 값5, ...) (이름1:값1, 이름2:값2, 이름3:값3) 함수에서 여러 개의 값을 한꺼번에 return 하는 경우 ㄴ 여러 개의 값을 tuple 에 저장해서 반환함 */ var tp1 = ("이율곡", 18, 178.7) print(tp1.0) print(tp1.1) print(tp1.2) // unpacking var (name, age, height) = ("이율곡", 18, 178.7) (name, age, height) = tp1 print("name : \(name)") print("age : \(age)") print("height : \(height)") le..
import UIKit struct Student{ var name = "tjoeun" var age = 21 func test1(){ print("test1() 호출") } } // 구조체 배열 var studentArr: [Student] = [] var std1 = Student() var std2 = Student() std1.name = "이순신" std1.age = 46 std2.name = "안중근" std2.age = 30 studentArr.append(std1) studentArr.append(std2) for student in studentArr{ print(student.name) print(student.age) student.test1() } print("------------..
import UIKit // 일반함수 func calculate(n1: Int, n2: Int, test1:(Int, Int)->Int) -> Int{ return(n1 + n2) } // 클로저의 변형된 형태 // 실행시 code block(클로저)을 바로 선언하는 형태 var result = calculate(n1:10, n2: 20, test1:{ (n1: Int, n2: Int) -> Int in return n1 + n2 }) print("result : \(result)") // type 추론을 이용해서 return type 을 생략하는 형태 result = calculate(n1: 11, n2: 22, test1: { (n1: Int, n2: Int) /* -> Int */ in return..
/* 클로저(Closure): Code Block code block 을 변수에 할당할 수도 있고 매개변수(parameter)로 전달할 수도 있고 실행할 수도 있음 통신: 요청(request)과 응답(response)처리 UI이벤트: ex) click 이벤트 발생할 때 실행됨 클로저 만드는 방법(형식) { (parameter: type) -> return type in 실행 code (statement) } */ // 일반 변수 var number: Int = 11 // 일반 함수 func add(n1:Int, n2:Int) -> Int{ return n1 + n2 } print("add(n1:11, n2:22) : \(add(n1:11, n2:22))") // 클로저 : code block 을 만듬 v..