TID #3 (22.01.06)

한황희·2022년 1월 6일
0

Today I Done

목록 보기
3/3

0106

Schedule

1100 기상
1100 ~ 1200 : 샤워 & 식사
1200 ~ 1230 : 도서관 출근
1230 ~ 1400 : Spotify Clone Coding Lecture 1
1400 ~ 1550 : Spotify Clone Coding Lecture 2
1550 ~ 1610 : 산책 & 간식 충전
1610 ~ 1830 : 앨런 swift bootcamp 강의
1830 ~ 1930 : 귀가 & 식사 및 휴식
1930 ~ 2100 : 수영장으로 이동 & 수영
2100 ~ 2130 : 신문 읽으며 휴식
2130 ~ 2200 : 휴식
2200 ~ 2300 : 앨런 swift bootcamp 강의
Total 공부시간 : 7시간 

Feedback

늦게 일어난 게 아쉽지만, 그래도 시간을 알차게 쓴 하루.
특히 Clone Coding 하는 게 재밌었다.
아직 잘 알지 못하지만, iOS를 잘 선택했음을 느낄 수 있었던 순간이 있던 하루였다.
일찍 일어나서 수영하고 도서관 출근해서 끝까지 공부할 수만 있다면 더없이 좋겠다.
습관을 들여보자!

Today I Learned

Lecture 1
StoryBoard 를 제거하고, AppDelegate 와 SceneDelegate를 수정함으로써
화면을 꾸미는 방식으로 진행하고 있다.

이번 수업에서는 App/Scene Delegate에서 ViewController 들을 호출해,
ViewController 에서 세부 logic을 채움으로써 프로그램을 짜는데,
  1. Large Title 을 원하는 방식으로 다는 법
  2. SF symbol 들을 앱에 집어넣는 방법
  3. background color 를 채우는 방법

들을 경험해보았다.


> Lecture 2

```swift
이번 수업에서는 Spotify API를 끌어다와서 Authorization 을 진행했다.
우선 Authorization 화면을 AuthViewController를 수정함으로써 만들었고,
Sptify API에 접근하여 URL을 parsing 해서 해당화면과 이어주었다.

API를 활용하는 경험을 해볼 수 있었던 것 같은데,
내 페이지에서는 강사의 화면 페이지를 접근할 수가 없어서 많이 헤메었다.
앨런’s Swift Camp

Lecture 1
1. argument Label

func printName(first name: String){		
		print("my name is \(name) !")
}

print(first: Han)

-> first를 argument Label 이라고 한다.
함수 호출시 어떤 argument 를 넘기는지 길게 쓸 수 있어 편리하다!


2. 와일드카드 패턴을 사용할 수도 있다.
```swift
func addPrintFunction(_ firstNum: Int, _ secondNum: Int){
	print(firstNum + secondNum)
}

addPrintFunction(3,4)

-> 와일드카드 패턴을 사용해서 argument label 을 생략해서 사용할 수도 있다!!
  1. 가변파라미터
func arithmeticAverage(_ numbers: Double ...) -> Double{
	var total = 0.0
	for number in numbers {
		total += number	
	}

	return total / Double(numbers.count)
}

arithmeticAverage(1)
arithmeticAverage(1,3)
arithmeticAverage(1.5,3.5,4.5) ....

-> 함수의 파라미터가 몇 개인지 정해지지 않았을 때, type만 정해놓고서 argument들을 받는다
	(Type) ... : 를 가변파라미터라고 한다.
  1. 함수의 파라미터에 기본값(디폴트) 정하는 것도 가능하다
func numFunction(num1: Int, num2: Int =5) -> Int{
	var result = num1 + num2
	return result
}

numFunction(num1: 3) -> 3+5return 될 것
numFunction(num1: 3, num2: 7) -> 3+7return 될 것

Ex : Print 함수도 기본값이 정해진 것과 똑같다.


print("내용",separator:"",terminator:"\n") 

print(items: Any ..., separator: String, terminator: String) 이 원형이다!

-> 별다른 수정값이 들어오지 않으면 argument를 기본값으로 사용

Lecture 2
1. 함수의 파라미터에 대한 정확한 이해

func someAdd(a: Int) -> Int{
	//	let a 로 선언되어있음.
	따라서 내부에서 var b = a 로 받아주는 방식으로 a값을 변경시킨다.
}

someAdd(a: 5)


2. 함수 내의 변수의 scope(스코프)
```swift
함수 내에서 선언한 변수의 Scope는 함수의 바디로 제한된다는 거. (당연)
  1. return 키워드의 정확한 이해
함수를 호출하는 것은 자체로 표현식. 함수 내에서 return 나오면 함수 종료 (당연)
  1. Nested Function
func chooseStepFunction(backward: Bool, value: Int) -> Int{
	func stepForward(input: Int) -> Int{
		return input +1
	}

	func stepBackward(input: Int) -> Int{
		return input -1
	}

	if backward{
		return stepBackward(input: value)
	}
	else{
		return stepForward(input: value
	}
}

Swift에서는 함수 내에 함수를 새로 정의해서 호출할 수도 있다.
당연히 함수 내부에서만 살아있는 함수로 취급된다.

Lecture 3
1. 함수 표기법

doSomething(){
	print("SomeThing")
}

var some = doSomething : 변수에 함수를 저장할 수 있다.
some() == doSomething() : 동일하게 동작한다

-> 함수 표기법
1. 파라미터가 없는경우 : 그냥 함수 이름을 호출해서 가리킨다.
2. 파라미터가 있는 경우 : 파라미터의 값 부분을 지운다.
Ex. addNumber(n num: Int){
return n+1
}

addNumber(n:) : 이렇게 함수를 가리킨다.
3. argument label이 생략된 경우(와일드카드 패턴): addPrintFunction(::) 로 가리킨다.

chooseStepFunction(backward:value:) : chooseStepFunction-backward-value 함수
라고 부른다.

2. 함수 타입의 표기법
```swift
var function1 = numberPrint(n:)


var function1 : (Int) -> () = numberPrint(n:)
				(Int) -> Void
var function2 : (Int, Int) -> (Int) = numberPrint(n:) 
  1. 함수의 오버로딩
    오버로딩 : 과적하다 (하나의 함수의 이름에 여러 함수를 과적하다)
func doSomething(value: Int){
	print(value)
}

func doSomething(value: Double){
	print(value)
}


func doSomething(value: String){
	print(value)
}


func doSomething(value1: String, value2: String){
	print(value1,value2)
}


func doSomething(value1: String, value2: Int){
	print(value1,value2)
}

-> 함수 이름 하나에 여러 파라미터 형태가 대응되도록 오버로딩을 할 수 있다.

컴파일러는 함수 이름, 파리미터 수/자료형, 아규먼트 레이블, 리턴형 등을 모두 포함해서 구분해준다.
  1. 줄 맞추기
Command + I 를 누르면, 컴파일러가 자동으로 줄을 맞춰준다.
  1. 제어전송문
 break
continue
fallthrough: switch 문에서 사용할 수 있다. 실행한 뒤 다음 케이스도 실행시켜줌.

throw : 에러와 관련되어 있음

Lecture 4
1. 함수 실행의 메모리 구조
시스템프로그래밍에서 배웠던 내용을 좀 더 쉽게, 그림으로 배울 수 있었다.
Q. 전역변수는 어디에 저장되는가?
-> 데이터 영역에 저장된다. (아 맞다!)

코드 : 모든 코드가 메모리에 올라가고, 한 문장씩 실행 !

데이터 : 전역변수 저장 / 공유영역 -> 스택에서 접근 가능
힙 :
스택: 스택프레임 / 함수의 범위 : 스텍프레임과 데이터 영역 (외부에서 접근 불가능)

if - else 문 : jump!
for문 : 되돌아간다.

Lecture 5
1. inout 파라미터

Swift의 함수 내 파라미터는 기본적으로 call by value 형식이고 임시상수라서 변경 불가하다.

But
inout 키워드가 함수 내에서 변수를 직접 수정하도록 돕는다. :
Call by reference 형식으로, 주솟값이 전달된다. 즉 원본이 전달된다
Pointer 같은 개념인 것 같다. (copy-in,copy-out)

func swapNumber(a: inout Int, b: inout Int){
var temp = a
a = b
b = temp
}

swapNumber(a: &num1, b: &num2)

⚠️inout 키워드를 사용해서 가변 파라미터로 선언하는 건 불가능함.


2. Guard 문
```swift
Swift에서만 유일한 조건문: if문이 여러개 있을 때 코드의 가독성이 문제되는 걸, 극복해줌.

func checkNumbersOf1(password: String) -> Bool{

	if password.count >=6{
	}
	else{
		return false	
	}
	print("pass")
}

VS

func checkNumbersOf2(password: String) -> Bool{

	guard password.count>=6 else { return false }
	print("pass")
}

statement 를 만족하지 않으면 먼저 else 문을 실행시킴.
else 문 안에는 **early exit** 조건이 필요하다! ( return, throw, break, continue )
함수에서 쓰일 경우 return,throw 가, 
반복문에서 쓰일 경우 break, continue 가 
반드시 들어가야 한다.

가드문에서 선언된 변수를 아래 문장에서 사용가능함. 즉 동일한 스코프로 취급함.

사용 이유:
(1) 가독성을 높임 / if문의 불편함을 해소
(2) 여러개의 옵셔널 타입을 안전하게 벗기기 가능 - 추후 설명 예정

  1. @Attribute 키워드 : discardableResult
선언에 추가정보 제공: Ex : @available
타입에 추가정보 제공: Ex : @escaping
등 @가 붙는 걸 Attribute 키워드라고 한다.

func sayHello(){
	print("안녕하세요")
}

func sayHelloString() -> String{
	print("하이")
	return "안녕하세요"
}

_ = sayHelloString() : 이렇게 해서 warning을 제거함 (~Swift ver4 패턴)

@discardableResult
func sayHelloString() -> String{
	print("하이")
	return "안녕하세요"
}

: 이 함수의 결과물은 버릴수도 있는 결과야! 라고 컴파일러에게 알려줌 -> waring 제거

  1. API 란
    Application Programming Interface(응용 프로그래밍 인터페이스) 의 약자로,
    애플이 미리 만들어놓은 API(내장함수)와 서버와 통신하기 위해 만드는 API로 나뉜다.
    이를 통해 간단하게 코드의 양을 줄일 수 있다.

0개의 댓글