일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 단일 책임원칙
- 러닝타이머
- Protocol
- 영문 개인정보처리방침
- 클로저의 캡슐화
- Timer
- App Store Connect
- Required Reason API
- Startign Assignments
- SwiftUI Boolean 값
- MKMapItem
- MKMapViewDelegate
- Xcode
- 한국어 개인정보처리방침
- xcode로 날씨앱 만들기
- RunningTimer
- addannotation
- swift
- dispatchsource
- 러닝기록앱
- UICollectionViewFlowLayout
- CoreLocation
- weatherKit
- WeatherManager
- 서체관리자
- UIAlertAction
- AnyObject
- CLLocationManagerDelegate
- weak var
- font book
- Today
- Total
목록전체 글 (217)
VesselWheel
import UIKit // Optional Biding var n1: Int? = nil // if 조건으로 작성하면 강제 unwrapping 해야 함 if n1 != nil{ print(n1!) }else{ print("nil") } // Optional Binding 으로 하면 ! 을 사용하지 않음 if let n1{ print(n1) }else{ print("nil") } var str1: String? = "swift5" guard let str1 else{ fatalError() } print("str1 :", str1) let n2: Int? = 3333 let str2: String? = "IOS" // 아래의 if문이 실행되려면 // let n2_1 = n2, // let str2_1 =..
import UIKit /* Optional (옵셔널) Int type Optional Int type */ // Int type 의 값 할당하기 var n1: Int = 10 // Optional Int type 의 값 할당하기 // ㄴ Int type 의 값을 할당하거나 // 아무 값도 할당되지 않은 상태(nil) var n2: Int? = 20 var n3: Int! var n4: Int! = 40 print(n1) print(n2) // 갑을 할당하지 않으면 자동으로 nil 로 설정됨 print(n3) print(n4) print(Int(100)) print(100) // Optional(1234) print(Int("1234")) // 값을 사용하려면 Optional 을 풀어줌 : ! // 12..
import UIKit var number = 1 while number
import UIKit /* 각 단에 홀수만 곱하는 구구단을 작성하세요 dan number
import UIKit /* while loop while (종료)조건{ 반복할 명령문 ㄴ while 의 조건이 참인 동안만 반복함 } for (index 변수) in range/collection{ 반복할 명령문 ㄴ range/collection 에 저장된 data(item) 의 개수 만큼 반복함 } */ for number in 1...5{ print(number) } print("---------") var number = 1 while number 3{ break } } print("-------------") for num in 1...10{ if num > 3{ break } print("num :",num) } print("-------------") for num in 1...10{ if ..
import UIKit // nested for loop // 중첩 for 문 // 구구단 // 단수 X 곱하는 수 // (일정) (1 ~ 9) print("2 X 1 = 2") print("2 X 2 = 4") print("2 X 3 = 6") print("2 X 4 = 8") print("2 X 5 = 10") print("2 X 6 = 12") print("2 X 7 = 14") print("2 X 8 = 16") print("2 X 9 = 18") print("----------------") /* var dan = 2 var number = 1 */ for number in 1...9{ print("2 X",number,"=",2 * number) } for number in 1...9{ pri..
import UIKit /* 반복문 for loop (index 변수) for loopConstant in Range{ 반복할 명령문 } */ // 1 2 3 4 5 6 7 8 9 10 for count in 1...10{ print("안녕하세요 -",count) } // _ : wildcard pattern for _ in 1...5{ print("hello, swift5 !!!") } // 1 부터 10 까지의 합을 for 문으로 작성하기 let number = 10 var sum = 0 // 1 2 3 4 5 6 7 8 9 10 for num in 1...number{ sum += num } print("합계 :", sum) let end = 10 var result = 1 for _ in 1.....
import UIKit // Expression Pattern let num = 11 switch num{ // interval matching // ... : 범위 연산자 case 0...10: print("0 ~ 10") default: break } // Pattern Matching Operator struct Size{ var width = 0.0 var height = 0.0 // Pattern Matching 연산자 overloading하기 // parameter 의 자료형과 순서를 맞추어 줌 static func ~=(left: Range, right:Size) -> Bool{ // 1..
import UIKit /* Value Binding Pattern case let 변수: case var 변수: */ let number = 10 /* case let num: 에서 num이라는 변수가 메모리에 로딩되고 switch number 에 있는 number 가 let num 에 할당됨(binding:복사됨) binding 된 상수(let num)는 case 블럭 안에서만 사용할 수 있음 */ switch number{ case let num: print("num :",num) } // binding 된 상수(let num)는 case 블럭 안에서만 사용할 수 있음 // print("num :",num) switch number{ case let num where num > 100: print(..
import UIKit /* guard 문 guard 조건문 else{ 명령문 } guard (Optional Binding) else{ 명령문 } */ // 문자열을 parameter 로 받아서 // Bool type 의 값을 return 하는 함수 func validate(id: String?) -> Bool{ // parameter 로 전달된 문자열에 // 실제로 문자열이 할당되어 있는지 확인함 guard let id = id else { print("guard let id = id else") return false } // parameter 로 들어온 문자열의 길이가 // 6 보다 크거나 같으면 true 가 되어서 // guard 문 이외의 code 가 실행됨 guard id.count >= 6..
-> ATSetting에서 오른쪽 마우스 "add Row" 클릭하여 하위 설정으로 'Allow Arbitrary Loads, boolean, yes로 설정 struct Menu : Identifiable{ var id = UUID() var name : String var price : String var imageURL : String var message : String } struct MenuRow : View{ var menu : Menu @Binding var showToast : Bool @Binding var toastMessage : String var body: some View{ HStack{ WebImage(url: URL(string: menu.imageURL)) .rendering..
https://stackoverflow.com/questions/73425418/type-videoview-does-not-conform-to-protocol-uiviewrepresentable Type 'VideoView' does not conform to protocol 'UIViewRepresentable' I'm trying to embed a YouTube video into my app and keep getting this error Type 'VideoView' does not conform to protocol 'UIViewRepresentable' here's my code: import SwiftUI import WebKit struct stackoverflow.com import ..
[CocoaPods 사용법과 터미널 내용] [터미널창에서 실행함] 1) 기본 프로젝트 닫음 2) 파인더에서 프로젝트폴더 오른쪽 클릭하고 현재 폴더에서 새로운 터미널 열기 3) Cocoa Pod 유틸 설치하기 a. sudo gem install cocoapods 입력하고 엔터 안 되면 sudo gem install cocoapods -v 1.8.4 입력하고 엔터 b. Cocoa Pod 업데이트하기 pod repo update 입력하고 엔터 4) 프로젝트 초기화하기 : pod init 5) 라이브러리 설치하기 : pod install 6) 프로젝트 열기 workspace 열기 : open ex12.xcworkspace 7) Xcode 에서 pod 파일 편집 pod 'AlertToast' pod 'SDWebI..
import UIKit /* switch 문 switch 값(변수,값,수식){ case 값(switch 키워드 옆에 있는 값과 비교함): 명령문 case 값(switch 키워드 옆에 있는 값과 비교함): 명령문 default: 명령문 } */ let num1 = 1 switch num1{ case 1: print("one") case 2, 3: print("two or three") default: print("others") } switch num1{ case let number where number
import UIKit // if 문 var number = 10 if number != 10 { print("number 는 10이 아닙니다") }else if number > 5{ print("number 는 5 보다 큽니다") }else if number 5{ print("number 는 5 보다 큽니다") } if number
import UIKit /* 제어문 : Control Statement 조건문 - if /switch 반복문 - for-in / while - 조건이 하나인 if 문 if 조건문 { 실행문.. } - 조건이 두 개인 if 문 if 조건문 { 실행문.. }else{ 실행문... } - 조건이 여러 개인 if 문 if 조건문 { 실행문.. }else if 조건문{ 실행문... }else if 조건문{ 실행문... }else if 조건문{ 실행문... }else{ 실행문... } */ let id = "tjoeun" let pw = "1234joeun" if id == "tjoeun"{ print("유효한 아이디입니다") } if pw == "1234joeun"{ print("유효한 비밀번호입니다") } if..
import UIKit // 사용자 정의 연산자 // Custom Operators prefix operator +++ // Int type 에 연산자 추가하기 extension Int{ static prefix func +++(num: inout Int){ num += 2 } } var num1 = 10 +++num1 num1 // 사용자 정의 연산자를 정의할 때 // 우선순위 그룹을 지정해야 함 // 이 경우에는 우선순위 그룹을 지정하지 않아서 기본 그룹에 속하게 됨 // + 연산자는 'AdditionPrecedence' 에 속해 있음 // 사용자 정의 우선순위 그룹 설정하기 precedencegroup UserPrecedence{ higherThan: AdditionPrecedence } // 1 ..
import UIKit // operator methods 10 == 10 "a" == "a" // 구조체 : 서로 같거나 다른 type 의 변수를 모아놓은 것 // struct 구조체이름 { 변수들... } struct Point{ var x = 0.0 var y = 0.0 } let point1 = Point(x: 12, y: 36) let point2 = Point(x: 12, y: 36) /*Binary operator '==' cannot be applied to two 'Point' operands point1 == point2 */ // Point 구조체에서 사용할 == 연산자 작성하기 extension Point: Equatable{ // (p1: Point, p2: Point) - par..
import UIKit // 범위 연산자 : Range Operator // start...stop // lowerBound ... upperBound // ascending 1 ... 10 // descending (1 ... 10).reversed() 12.34 ... 56.89 var sum = 0 for num in 1 ... 10{ sum += num } sum /* 1... ...10 */ var alphabets = ["A", "B", "C", "D", "E", "F", "G"] // index 번호를 지정함 : 0 부터 시작 alphabets[3] alphabets[3...] alphabets[...3] /* 정수를 시작이나 끝에만 지정할 때는 숫자와 ... (범위연산자) 를 붙여써야 함 ..
import UIKit // bitwise left shift operator /* 1010 : 10 10100 : 20 101000 : 40 1010000 : 80 변수 > 2 num1 >> 3 num1 >> 4 /* 변수에 할당된 값을 증가시키기 */ var num5 = 10 var num6 = 1 num5 = num5 + num6 num5 += num6 num5 = num5 - num6 num5 -= num6 num5 = num5 * num6 num5 *= num6 num5 = num5 / num6 num5 /= num6 num5 = num5 % num6 num5 %= num6 num5 = num5 & num6 num5 &= num6 num5 = num5 | num6 num5 |= num6
import UIKit // Bitwise Operator : bit 연산자 /** 0000 0000 0000 0010 1111 1101 */ let num1: UInt8 = 0b0000_0010 // ~ : bit 를 반대로 바꿔줌 num1 ~num1 // bitwise and operator : & // 각 bit 가 모두 1인 경우에만 // 1을 반환함 var num2: UInt8 = 10 var num3: UInt8 = 5 /* 0000_1010 0000_0101 & 0000_0000 */ num2 = 0b0000_1010 num3 = 0b0000_0101 var result = num2 & num3 result // bitwise or operator : | // 각 bit 가 모두 0일 때만 ..
import UIKit // 논리연산자의 short circuit evaluation true && true true && false false && true false && false var num1 = 1 var num2 = 1 func updateNum1() -> Bool{ num1 += 1 return true } func updateNum2() -> Bool{ num2 += 1 return true } num1 num2 if updateNum1() && updateNum2(){ print("if 문 실행됨") } num1 num2 if updateNum1() || updateNum2(){ print("if 문 실행됨") } num1 num2 /* true && 11
import UIKit // 삼항연산자 (Ternary [Conditioanl] Operator) // ㄴ 조건을 포함함 // 값1(조건식) ? 값2 : 값3 // 조건식이 참이면 값2 를 반환하고 // 조건식이 거짓이면 값3 을 반환함 var number = 15 // 값1(조건식) ? 값2 : 값3 number % 2 == 0 ? "짝수" : "홀수" var result: String = "" if number % 2 == 0{ result = "짝수" }else{ result = "홀수" } let absNumber: Int number = -100 absNumber = number >= 0 ? number : -number absNumber /** 성적이 70 점 이상이면 합격, 미만이면 불합격을..
import UIKit // 비교 연산자 let num1 = 10 let num2 = 20 num1 == num2 "hello" == "Hello" let num3 = 3 let num4 = 3.0 // 서로 다른 type 을 비교연산 할 수 없음 // num3 == num4 num3 == Int(num4) // 산술 부정연산자 : != num1 == num2 num1 != num2 num3 != Int(num4) num1 > num2 // 문자열의 비교연산은 ASCII CODE 를 비교함 "hello" > "Hello" num1 >= num2 num1 30 && number2 == 0 number1 < 30 && number2 != 0 number1 < 30 || number2 != 0 number1 ..
import UIKit // Overflow Operators // Int8 : -128 ~ 127 : -(2**7) ~ 2**7 - 1 // Int16 : -(2 ** 15) ~ 2 ** 15 - 1 Int8.min Int8.max // Arithmetic operation '127 + 1' (on type 'Int8') results in an overflow // 지정한 type 을 넘어서는 값을 할당하려면 컴파일에러 발생함 // let num1: Int8 = Int8.max + 1 // Swift 는 기본적으로 overflow 연산을 허용하지 않음 // overflow 연산자를 사용하면 overflow 연산을 할 수 있음 let num1: Int8 = Int8.max // overflow 연산 /..
import UIKit // Type // typealias 타입별칭 = 원래타입 let latitude: Double = 45.68 let longitude: Double = 87.21 type(of: latitude) type(of: longitude) typealias Coordinate = Double let lat: Coordinate = 12.34 let lon: Coordinate = 56.78 type(of: lat) type(of: lon) // 연산자 : operator // 일항(unary)연산자 // 이항(binary)연산자 // 삼항(ternary)연산자 // ㄴ 값1 ? 값2 : 값3 // 연산자 우선순위 // 산술연산자 -> 비교연산자 -> 논리연산자 // 연산의 방향 : 왼쪽..
import UIKit // Type Conversion // ㄴ 메모리에 저장된 값 자체를 형변환함 // Type Casting //. ㄴ 메모리에 저장된 값은 형변환하지 않고 // compiler 가 다른 형식으로 처리하게 함 // 형변환 형식 : 타입(값) let num1 = 1234 let num2 = 12.34 // 두 변수의 type 을 같게 해야 오류가 발생하지 않음 print(Double(num1) + num2) print(num1 + Int(num2)) // Int8(정수) : Int8 type 에서 // 저장할 수 없는 크기인 경우, // Int8보다 큰 type 으로 conversion // 해야 됨 let num3 = Int16(num1) // 123 은 Int8 type으로 // ..
import UIKit // Type Safety // 적절한 type 으로 값을 처리하기 위해서 // type을 엄격하게 지킴 // 지정한 type에 맞는 값만 할당해야 함 // let str1: String = 123 let str1: String = "123" // Int type 변수에 실수를 할당하지 못함 // let num1: Int = 3.14 // num2 나 num3 나 모두 Int type // 이지만 값을 저장하는 공간의 크기가 달라서 num2 를 num3에 할당하지 못함 let num2 = 23 type(of: num2) // let num3: Int8 = num2 let num4 = 12 let num5 = 23.45 // Int type과 Double type을 // 같이 연산하..
import UIKit // type 추론(inference) let number = 21 print(type(of: number)) let numberF = 12.34 print(type(of: numberF)) let str1 = "IOS" print(type(of: str1)) let b1 = true let b2 = false type(of: b1) type(of: b2) // 할당된 값이 없으면 타입추론을 못함 // let value /** let 변수: 타입 = 값 타입을 명시한 경우에는 초기화하지 않아도 변수를 메모리에 올림 let 변수: 타입 */ // 타입지정 + 초기화 let num: Int = 1234 // 타입지정해서 변수 선언함 let num2: Int // Type annotat..